目前维护一个项目,数据库连接了2个,一个Mysql,一个oracle。原始的项目是只连接了oracle,由于后面需求增加了,又连接了一个mysql.oracle的部分用hibernatemysql的部分用的spring,jdbctemplate注意红色部分没有用hibernate。不知道这样配置可以否?这样的配置会造成项目运行一天左右就会内存溢出。如果我把红色部分去掉则不会内存溢出。请问连接同一个数据库可以用2个不同的持久层吗?以下配置又出现什么样的错误?请指教!配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"-->
<!--"http://www.springframework.org/dtd/spring-beans.dtd">--><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:DataBase.properties</value>
</list>
</property>
</bean>
<bean id="transactionManager2"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource1" />
</bean> <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- Transaction template for Managers -->
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager" />
<property name="proxyTargetClass">
<value>true</value>
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="relation*">PROPAGATION_REQUIRED</prop>
<prop key="disconnect*">PROPAGATION_REQUIRED</prop>
<prop key="assign*">PROPAGATION_REQUIRED</prop>
<prop key="unassign*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
</props>
</property>
</bean>
<bean id="dataSource1"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>${db.driver}</value>
</property>
<property name="url">
<value>${db.url}</value>
</property>
<property name="username">
<value>${db.username}</value>
</property>
<property name="password">
<value>${db.password}</value>
</property>
<property name="initialSize">
<value>${db.pool.initial}</value>
</property>
<property name="maxActive">
<value>${db.pool.max}</value>
</property>
<property name="defaultAutoCommit" value="false" />
</bean> <bean id="dataSource"
class="org.logicalcobwebs.proxool.ProxoolDataSource"> <property name="driver">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="driverUrl">
<value>
jdbc:oracle:thin:@localhost:1521:DB?useUnicode=true:characterEncoding=UTF-8
</value>

</property>
<property name="user">
<value>USER</value>
</property>
<property name="password">
<value>i123321</value>
</property>
<property name="alias">
<value>ITVDB</value>
</property>
<property name="delegateProperties">
<value>user=USER,password=i123321</value>
</property> <property name="houseKeepingSleepTime">
<value>90000</value>
</property>
<property name="prototypeCount">
<value>5</value>
</property>
<property name="maximumConnectionCount">
<value>100</value>
</property>
<property name="minimumConnectionCount">
<value>10</value>
</property>
<property name="trace">
<value>true</value>
</property>
<property name="verbose">
<value>true</value>
</property>
</bean>
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean> <bean id="sessionFactory" lazy-init="true"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="mappingResources">
<list>
<value>
com/ffcs/itv/resources/program/Catalog.hbm.xml
</value>

</list>
</property> <property name="hibernateProperties">
<props>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.OSCacheProvider
</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.dialect">
org.hibernate.dialect.HSQLDialect
</prop>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
<prop key="hibernate.show_sql">true</prop>

<prop key="hibernate.cglib.use_reflection_optimizer">
true
</prop>
<prop key="hibernate.proxool.xml">proxool.xml</prop>
<prop key="hibernate.proxool.pool_alias">ITVDB</prop>
</props>
</property>
</bean> <!-- catalogService bean definition -->
<bean id="catalogDao"
class="com.ffcs.itv.program.dao.impl.CatalogDAOImpl"
lazy-init="true">
<property name="jdbcTemplate">
<ref local="jdbcTemplate" />
</property>
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean> <bean id="catalogService" parent="txProxyTemplate"
lazy-init="true">
<property name="target">
<bean
class="com.ffcs.itv.program.service.impl.CatalogServiceImpl">
<property name="catalogDao">
<ref local="catalogDao" />
</property>
</bean>
</property>
</bean>
<!-- ClientUserDaoImpl bean definition -->
<bean id="clientUserDao"
class="com.ffcs.itv.program.dao.impl.ClientUserDaoImpl"
lazy-init="true">
<property name="jdbcTemplate">
<ref local="jdbcTemplate" />
</property>
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean> <bean id="clientUserService" parent="txProxyTemplate"
lazy-init="true">
<property name="target">
<bean
class="com.ffcs.itv.program.service.impl.ClientUserServiceImpl">
<property name="clientUserDao">
<ref local="clientUserDao" />
</property>
</bean>
</property>
</bean> <!-- ClientUserDaoImpl bean definition -->
<bean id="loginLogDao"
class="com.ffcs.itv.program.dao.impl.LoginLogDAOImpl"
lazy-init="true">
<property name="jdbcTemplate">
<ref local="jdbcTemplate" />
</property>
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!-- ipconfig -->
<bean id="ipDao"
class="com.ffcs.itv.program.dao.impl.IpConfigDaoImpl">
<property name="jdbcTemplate">
<ref local="jdbcTemplate" />
</property>
</bean>
<bean id="ipService" parent="txProxyTemplate" lazy-init="true">
<property name="target">
<bean
class="com.ffcs.itv.program.service.impl.IpConfigServiceImpl">
<property name="ipDao">
<ref local="ipDao" />
</property>
</bean>
</property>
</bean>
<bean id="loginLogService" parent="txProxyTemplate"
lazy-init="true">
<property name="target">
<bean
class="com.ffcs.itv.program.service.impl.LoginLogServiceImpl">
<property name="dao">
<ref local="loginLogDao" />
</property>
</bean>
</property>
</bean> <bean id="iptvBaseDao"
class="com.sn.xmitv2010.manage.dao.Impl.ImspContentBaseDaoImpl">
<property name="dataSource">
<ref local="dataSource1" />
</property>
</bean>
<bean id="iptvBaseService" parent="txProxyTemplate"
lazy-init="true">
<property name="target">
<bean
class="com.sn.xmitv2010.manage.service.Impl.ImspContentBaseServiceImpl">
<property name="iptvBaseDao">
<ref local="iptvBaseDao" />
</property>
</bean>
</property>
</bean>
<bean id="accountDao"
class="com.ffcs.itv.program.dao.impl.IptvAccountDaoImpl">
<property name="jdbcTemplate">
<ref local="jdbcTemplate" />
</property>
</bean>

<bean id="accountService" parent="txProxyTemplate"
lazy-init="true">
<property name="target">
<bean
class="com.ffcs.itv.program.service.impl.IptvAccountServiceImpl">
<property name="accountDao">
<ref local="accountDao" />
</property>
</bean>
</property>
</bean>
</beans>

解决方案 »

  1.   

    搞清问题的根源。
    内存溢出是因为程序中有没有释放的java对象(Java Web也是一个java程序)。使用 visualvm等类似性能检测工具查一查。
      

  2.   

    很有可能是dataSource的配置有问题,加上<maximum-connection-count>150</maximum-connection-count>
    <maximum-active-time>30000</maximum-active-time>试试
      

  3.   


    我也有感觉是dataSource配置出了问题。
      

  4.   

    我突然间发现,tomcat它的内存512,最大也1024
    我突然想到一个问题,
    如果在tomcat中放了多个项目,远远超过了这个数值呢?
    项目中放了 exe的可执行下载程序导致很大。
    会不会有这个可能?导致tomcat负载过重?内存不够用?
      

  5.   

    完全没有说到问题点上,内存泄露跟数据库连接没什么直接关系。泄漏还是内存不够用,这个要搞清楚。比如处理一个超长字符串会造成内存溢出,但并不是泄漏。
    关于加载多个项目的问题,tomcat本身是个java应用程序,作为程序,系统会限制他的内存大小,不能无限设置内存,但是可以使用集群的方式。
      

  6.   

    不知道你的泄漏问题处理的咋样了,最近也正在跟内存泄漏作斗争,发现一个好工具:jprofiler_windows_6_0_3,查找泄漏点很容易,一般来说不会是因为配置引起内存泄漏,肯定还是某些地方的代码没写好导致的。
      

  7.   


    我现在不会有这个问题了。
    但是我没改代码。
    我把tomcat里面的一些以前的项目,现在已经不用的给清除了。
    我怀疑我的那个确实是tomcat内存不够用了。