项目是用spring+hibernate,连接池一直使用的dbcp,oracle9i数据库,据说dbcp有性能问题,现在的确出现了些问题,正在找原因,网上说proxoolPool性能很好,
所以现在想换成proxoolPool,配置文件如下:
<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"
destroy-method="shutdown">
<property name="driver">
<value>${hibernate.connection.driver_class}</value>
</property>
<property name="driverUrl">
<value>${hibernate.connection.url}</value>
</property>
<property name="user">
<value>${hibernate.connection.username}</value>
</property>
<property name="password">
<value>${hibernate.connection.password}</value>
</property>
<property name="alias">    
     <value>${proxoolPool.alias}</value>
</property>
<property name="minimumConnectionCount">
     <value>${proxoolPool.minimumConnectionCount}</value>
</property>
<property name="maximumConnectionCount">
     <value>${proxoolPool.maximumConnectionCount}</value>
</property>
<property name="prototypeCount">
     <value>${proxoolPool.prototypeCount}</value>
</property>
</bean><bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
省略
<property name="lobHandler">
<ref bean="oracleLobHandler" />
</property>
</bean><!-- 使用spring+hibernate处理oracle BLOB-->
<bean id="nativeJdbcExtractor"
class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" />
<bean id="oracleLobHandler"
class="org.springframework.jdbc.support.lob.OracleLobHandler"
lazy-init="true">
<property name="nativeJdbcExtractor">
<ref bean="nativeJdbcExtractor" />
</property>
</bean>
表中有个字段是clob类型,hbm配置文件
<property name="content" type="org.springframework.orm.hibernate3.support.ClobStringType" length="1048576000">
    <column name="CONTENT"/>
</property>当插入的时候报错,
java.lang.ClassCastException: oracle.jdbc.OracleConnection$$EnhancerByProxool$$849ab37f
at oracle.jdbc.driver.OracleConnection.unwrapCompletely(OracleConnection.java:4990)
at oracle.jdbc.driver.OracleConnection.physicalConnectionWithin(OracleConnection.java:5041)
at oracle.sql.CLOB.createTemporary(CLOB.java:959)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.prepareLob(OracleLobHandler.java:385)
at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.createLob(OracleLobHandler.java:334)
at org.springframework.jdbc.support.lob.OracleLobHandler$OracleLobCreator.setClobAsString(OracleLobHandler.java:260)
at org.springframework.orm.hibernate3.support.ClobStringType.nullSafeSetInternal(ClobStringType.java:82)
at org.springframework.orm.hibernate3.support.AbstractLobType.nullSafeSet(AbstractLobType.java:190)
at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:141)
at org.hibernate.persister.entity.BasicEntityPersister.dehydrate(BasicEntityPersister.java:1617)
at org.hibernate.persister.entity.BasicEntityPersister.dehydrate(BasicEntityPersister.java:1594)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1850)
at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2200)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:46)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:324)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:496)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:469)
at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:266)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
查看的时候正常,现在把配置文件改成string类型后,
<property name="content" type="string" length="1048576000">
    <column name="CONTENT"/>
</property>
插入正常,但查看的时候报空指针错误,
Servlet.service() for servlet NewProductServlet threw exception
java.lang.NullPointerException
at org.apache.catalina.connector.CoyoteWriter.write(CoyoteWriter.java:171)
at com.web.servlet.NewProductServlet.getProductRecordInfo(NewProductServlet.java:284)
at com.web.servlet.NewProductServlet.doGet(NewProductServlet.java:116)
at com.web.servlet.NewProductServlet.doPost(NewProductServlet.java:483)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:292)
at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:108)
at com.security.intercept.web.WdxcSecurityEnforcementFilter.doFilter(WdxcSecurityEnforcementFilter.java:40)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:143)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:246)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:246)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
at com.web.security.rememberme.WdxcRememberMeProcessingFilter.doFilter(WdxcRememberMeProcessingFilter.java:109)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:246)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:220)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:303)
at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:173)
at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:120)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.web.filter.WdxcStatisticFilter.doFilter(WdxcStatisticFilter.java:113)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:595)

解决方案 »

  1.   


    现在把驱动换成oracle10g的驱动ojdbc14_g.jar,启动工程报错,报no ocijdbc10 in java.library.path错误,错误如下,
    严重: Prototype
    org.logicalcobwebs.proxool.ProxoolException: Unexpected prototyping problem
    at org.logicalcobwebs.proxool.Prototyper.buildConnection(Prototyper.java:229)
    at org.logicalcobwebs.proxool.Prototyper.sweep(Prototyper.java:102)
    at org.logicalcobwebs.proxool.PrototyperThread.run(PrototyperThread.java:44)
    Caused by: java.lang.UnsatisfiedLinkError: no ocijdbc10 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682)
    at java.lang.Runtime.loadLibrary0(Runtime.java:822)
    at java.lang.System.loadLibrary(System.java:992)
    at oracle.jdbc.driver.T2CConnection.loadNativeLibrary(T2CConnection.java:3951)
    at oracle.jdbc.driver.T2CConnection.logon(T2CConnection.java:228)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:388)
    at oracle.jdbc.driver.T2CConnection.<init>(T2CConnection.java:142)
    at oracle.jdbc.driver.T2CDriverExtension.getConnection(T2CDriverExtension.java:93)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:622)
    at java.sql.DriverManager.getConnection(DriverManager.java:525)
    at java.sql.DriverManager.getConnection(DriverManager.java:140)
    at org.logicalcobwebs.proxool.DefaultConnectionBuilder.buildConnection(DefaultConnectionBuilder.java:39)
    at org.logicalcobwebs.proxool.Prototyper.buildConnection(Prototyper.java:159)
    ... 2 more
    现在把数据库连接方式改成thin方式,如jdbc:oracle:thin:@192.168.0.5:1521:ORADB
    启动正常,配置文件还是用原来的
    <property name="content" type="org.springframework.orm.hibernate3.support.ClobStringType" length="1048576000">
        <column name="CONTENT"/>
    </property>
    这时插入,查看都正常,
    配置文件换成string,
    <property name="content" type="string" length="1048576000">
        <column name="CONTENT"/>
    </property>
    后,插入报错,
    严重: setString 只能处理少于 32766 个字符的字符串
    2010-4-27 13:17:24 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
    严重: Could not synchronize database state with session
    org.hibernate.exception.GenericJDBCException: could not insert: [com.test.persistence.model.ProductRecord]
    at org.hibernate.exception.ErrorCodeConverter.handledNonSpecificException(ErrorCodeConverter.java:92)
    at org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:80)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1869)
    at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2200)
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:46)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:324)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:496)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:469)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:266)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)
    查看正常。
    现在得问题是:
    1。我想继续用原来oracle9i的驱动,用oci连接方式,proxoolPool做连接池,怎么能让clob字段很好的工作,原来用dbcp的时候一切正常,现在需要怎么配置proxoolPool,这是最好的方案。
    2。用oracle10g的驱动,用thin连接方式可以很好的工作,但是换驱动后会不会有其他的问题,现在还不太确定,只能进行测试了,再就是用thin方式后,性能会不会有所下降,网上的说法各不一样,我也是心理没有底儿。