Hibernate无法在JBoss中使用jndi与oracle 10g建立连接
我有一个在JBoss 4.2.3上运行并连接到Oracle 10g数据库的应用程序。 我们重构了使用spring roo的应用程序。 在尝试配置jndi之前,我们使用了常规的数据库连接字符串,这很好。 但是现在我们试图使用jndi,并且在JBoss注册jndi并创建数据源bean时,当hibernate实际上必须打开连接时,它无法打开。
这是持久性单元的配置
<persistence-unit name="persistenceUnitDev" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<!-- value="create" to build a new database on each run; value="update" to modify an existing database; value="create-drop" means the same as "create" but also drops tables when Hibernate closes; value="validate" makes no changes to the database -->
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
<property name="hibernate.connection.charSet" value="UTF-8"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.connection.datasource" value="java:jdbc.DataSourceDev"/>
<property name="hibernate.validator.apply_to_ddl" value="false" />
<property name="hibernate.validator.autoregister_listeners" value="false" />
<property name="jboss.entity.manager.jndi.name" value="java:jdbc.DataSourceDev"/>
<property name="jboss.entity.manager.factory.jndi.name" value="java:/Manager1Factory"/>
</properties>
</persistence-unit>
的hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<property name="connection.datasource">java:jdbc.DataSourceDev</property>
<property name="connection.autocommit">true</property>
<property name="connection.release_mode">after_transaction</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
<!--DB schema will be updated if needed -->
<property name="hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
应用程序上下文定义了db beans:
<jee:jndi-lookup id="jndiDataSource2" jndi-name="${database.jndiName}"/>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="persistenceUnitName" value="${hibernate.persistenceunit}"/>
<property name="dataSource" ref="jndiDataSource2"/>
</bean>
我不知道为什么hibernate似乎无法打开连接。
编辑:这是日志:
2011-12-05 12:34:51,577 WARN [org.jboss.resource.connectionmanager.JBossManagedConnectionPool]尝试获取新连接时可以引发:null org.jboss.resource.JBossResourceException:无法创建连接; - 在org.jboss的org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:190)处嵌套throwable:(java.sql.SQLException:Io异常:网络适配器无法建立连接) .resource.connectionmanager.InternalManagedConnectionPool.createConnectionEventListener(InternalManagedConnectionPool.java:619)at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.getConnection(InternalManagedConnectionPool.java:264)at org.jboss.resource.connectionmanager.JBossManagedConnectionPool $ BasePool.getConnection(JBossManagedConnectionPool .java:575)at org.jboss.resource.connectionmanager.BaseConnectionManager2.getManagedConnection(BaseConnectionManager2.java:347)at org.jboss.resource.connectionmanager.TxConnectionManager.getManagedConnection(TxConnectionManager.java:330)at org.jboss.resource。在org.jboss.reso上的connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:402) urce.connectionmanager.BaseConnectionManager2 $ ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:849)
< - cut - >
原因是:java.sql.SQLException:Io异常:网络适配器无法在oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)上建立连接,位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError。 (PhysicalConnection。)上oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)处的oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)在oracle.jdbc.driver.OracleDriver.connect(OracleDriver。)上的oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)处的oracle.jdbc.driver.T4CConnection。(T4CConnection.java:165) java:801)at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:172)
我设法弄清楚了这一点:
以下是我的配置。
<persistence-unit name="persistenceUnitDev" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
<property name="hibernate.connection.charSet" value="UTF-8"/>
<property name="hibernate.connection.datasource" value="dbjndiName"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<property name="hibernate.connection.autocommit" value="true"/>
<property name="hibernate.connection.release_mode" value="after_transaction"/>
<property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver"/>
<property name="show_sql" value="true"/>
<property name="format_sql" value="true"/>
<property name="use_sql_comments" value="true"/>
<!--DB schema will be updated if needed -->
<property name="hbm2ddl.auto" value="create"/>
<property name="hibernate.connection.provider_class" value="org.hibernate.connection.DatasourceConnectionProvider"/>
</properties>
</persistence-unit>
然后hibernate.cfg.xml为空
我的应用程序上下文是用下面的bean定义的:
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="persistenceUnitName" value="persistenceUnitDev"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">com.sun.jndi.fscontext.RefFSContextFactory</prop>
<prop key="java.naming.provider.url">file:c:/temp</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="resourceRef" value="true"/>
<property name="jndiName" value="dbjndiName"/>
<property name="lookupOnStartup" value="false"/>
<property name="cache" value="true"/>
<property name="proxyInterface" value="javax.sql.DataSource"/>
</bean>
我认为在这种情况下,这种情况不如使用Java EE JNDI查找并选择正确的数据源bean类。
链接地址: http://www.djcxy.com/p/61701.html上一篇: Hibernate can't open a connection with oracle 10g using jndi in JBoss
下一篇: SSL Broken Pipe