配置hibernate 4通过tomcat 7中的JNDI Datasource连接数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了配置hibernate 4通过tomcat 7中的JNDI Datasource连接数据库相关的知识,希望对你有一定的参考价值。

我使用Tomcat7,Struts-2.3.5,hibernate-4.1.7和jotm-2.1.9 width microsoft sqlserver 2005作为我的java Web应用程序框架。当我在hibernate configurarion中使用jndi数据源时,它拒绝工作。我在这个网站上看过一个貌似的帖子,Configure hibernate to connect to database via JNDI Datasource,没有解决问题。 1,我把资源定义放在tomcat server.xml中,而不是META-INF下的context.xml;

<Context docBase="C:workspacejavaspacessitexaweb"
privileged="true" antiResourceLocking="false" antiJARLocking="false">
<Resource name="jdbc/sitexaDB"
auth="Container" 
type="javax.sql.DataSource"
maxActive="20" maxIdle="5" maxWait="10000"
factory="org.objectweb.jotm.datasource.DataSourceFactory"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://127.0.0.1:1433;databaseName=sitexa"
username="sa" password=""/>
<Resource name="UserTransaction" auth="Container"         type="javax.transaction.UserTransaction" />
 </Context>

2,我把所有libs需要用于数据库连接和jta下的tomcat文件夹/ lib;

3,在web.xml中:

<resource-env-ref>
<description>DB Connection</description>
<resource-env-ref-name>jdbc/sitexaDB</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>

4,在hibernate.cfg.xml中:

<session-factory>

<property name="hibernate.connection.datasource">java:comp/env/jdbc/sitexaDB</property>

<property name="dialect">org.hibernate.dialect.SQLServer2005Dialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.max_fetch_depth">3</property>


<property name="hibernate.transaction.jta.platform">org.hibernate.service.jta.platform.internal.JOTMJtaPlatform</property>
<property name="hibernate.transaction.factory_class">org.hibernate.engine.transaction.internal.jta.JtaTransactionFactory</property>
<property name="hibernate.current_session_context_class">jta</property>
...
</session-factory>

5,例外:

%%%% Error Creating SessionFactory %%%%
org.hibernate.service.jndi.JndiException: Unable to lookup JNDI name [java:comp/env/jdbc/sitexaDB]
at org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:68)
at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:116)
...
Caused by: javax.naming.NamingException: This context must be accessed through a java: URL
at org.apache.naming.SelectorContext.parseName(SelectorContext.java:776)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:135)
at javax.naming.InitialContext.lookup(InitialContext.java:415)
at org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:65)
答案

在server.xml中的context.xml中添加数据。

<ResourceLink global="jdbc/sitexaDB" name="jdbc/sitexaDB" auth="Container"
    type="javax.sql.DataSource"/>
<Resource name="jdbc/sitexaDB" global="jdbc/sitexaDB" auth="Container"
    type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver"
    url="jdbc:sqlserver://127.0.0.1:1433;databaseName=sitexa" username="sa" password=""/>

以上是关于配置hibernate 4通过tomcat 7中的JNDI Datasource连接数据库的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库的Tomcat 7数据源配置

tomcat 7.0.42 pooling, hibernate 4.2, mysql 坚如磐石的自动重新连接解决方​​案

在树脂服务器上使用 Hibernate 5.4.1 的 Spring 5.0.7

集群环境中的故障​​转移不适用于 JSF 2、Richfaces 4、Tomcat 7

hibernate和tomcat的连接池问题

Hibernate之Hibernate环境配置