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

标签 hibernate tomcat

我正在尝试在 Tomcat 7 中创建一个数据源,以便在 Hibernate 代码中使用。

Tomcat 7.0.47

hibernate :4.2.7.Final

操作系统:Windows 7

context.xml

使用文档 herecontext.xml 文件中配置数据源。

context.xml 位置:<%Tomcat HOME%>\conf

<Resource name="hmsDS" auth="Container" type="javax.sql.DataSource"
                   maxActive="100" maxIdle="30" maxWait="10000"
                   username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
                   url="jdbc:mysql://localhost/hms"/>

hibernate .cfg.xml

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.datasource">java:comp/env/hmsDS</property>
        <property name="hibernate.hbm2ddl.auto">validate</property>
        <property name="show_sql">true</property>

        <mapping class="org.srs.hms.entity.TestEntity"/>

    </session-factory>
</hibernate-configuration>

关于启动 TomCat 控制台输出:

Jan 10, 2014 5:13:24 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:\InstalledSoftware\Java\jdk1.7.0_25\jre\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files (x86)\PC Connectivity Solution\;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\MySQL\MySQL Utilities 1.3.4\;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files (x86)\VisualSVN Server\bin;C:\Program Files\TortoiseGit\bin;C:\Program Files (x86)\Microsoft CHESS\bin\;D:\InstalledSoftware\Python25;D:\InstalledSoftware\GNUstep\bin;D:\InstalledSoftware\GNUstep\GNUstep\System\Tools;D:\InstalledSoftware\apache-maven-3.1.1\bin;"C:\Program Files (x86)\WinMerge";.
Jan 10, 2014 5:13:24 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Jan 10, 2014 5:13:24 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
Jan 10, 2014 5:13:24 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 436 ms
Jan 10, 2014 5:13:24 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Jan 10, 2014 5:13:24 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.47
Jan 10, 2014 5:13:25 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Jan 10, 2014 5:13:25 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Jan 10, 2014 5:13:25 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 353 ms

访问数据库的代码:

public class Test {
    private static SessionFactory sessionFactory;
    private static ServiceRegistry serviceRegistry;

    public static void main(String[] args) {
        Configuration configuration = new Configuration();
        configuration.configure();
        serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);

        Session sess = sessionFactory.openSession();
        sess.beginTransaction();

        sess.save(new TestEntity());
        sess.getTransaction().commit();
    }
}

从上面的代码访问数据库时出现以下错误:

Caused by: org.hibernate.service.jndi.JndiException: Error parsing JNDI name [java:comp/env/hmsDS]
    at org.hibernate.service.jndi.internal.JndiServiceImpl.parseName(JndiServiceImpl.java:92)
    at org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:63)
    at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:116)
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:76)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:160)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:132)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:223)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:89)
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:76)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:160)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:132)
    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1822)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1780)
    at org.srs.hms.dao.CommonDAO.<clinit>(CommonDAO.java:28)
    ... 27 more
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:344)
    at javax.naming.InitialContext.getNameParser(InitialContext.java:499)
    at org.hibernate.service.jndi.internal.JndiServiceImpl.parseName(JndiServiceImpl.java:86)
    ... 40 more

数据库连接数为'2'

查询:显示全局状态 where variable_name = 'Threads_connected';

我在运行测试类后运行查询。查询结果=2

问题 1 在配置数据源后重新启动 Tomcat 时,我没有在日志中看到任何与连接池相关的调试/跟踪语句。我期待与在连接池中创建连接等相关的信息。日志记录级别设置为“TRACE”。这正常吗?

问题 2 如何解决上面显示的错误?

更新 1 - web.xml

web.xml 更新为标签内的以下条目 数据库连接 数据库 javax.sql.数据源 容器

此更改也无济于事。

更新 2 我终于可以按照评论部分的建议让它工作了。谢谢大家。

这是我的分析结果:

不需要在 web.xml 中输入。 context.xml 中的条目足以使其正常工作。最初我是用一个独立的 Java 类(主要方法)进行测试,因此出现了上面提到的错误。它不能作为独立类工作,无法访问容器外部所需的上下文;我一个明显的菜鸟错误。当我从 UI 进行测试时,它运行良好。

特别感谢 Joe Rinehart 提出了正确的问题! +1

最佳答案

听起来您可能没有在与 Tomcat 本身相同的上下文/容器/jvm 中执行您的测试类。我会检查一下。

关于hibernate - MySQL数据库的Tomcat 7数据源配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21044183/

相关文章:

java - 使用 Hibernate 5.2 将查询结果作为流

java - 访问数据库时分离关注点的最佳实践

java - 事务注释不起作用

hibernate - javax.persistence.PersistenceException : org. hibernate.PropertyAccessException : could not get a field value by reflection getter of Entity. id

tomcat - Tomcat 的 Java VM 路径选择

java - 用于联系人列表的 Hibernate Pojo 设计

java - 从 Web 服务器异步调用应用程序

带有 Jersey 和 Tomcat 的 Java Web 服务。 ¿如何在 Web 服务停止时停止所有线程?

authentication - 如何在启用 cookie 的情况下使用 tomcat 身份验证?

jsf - 部署时未找到 FacesServlet