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

Posted

技术标签:

【中文标题】MySQL数据库的Tomcat 7数据源配置【英文标题】:Tomcat 7 data source configuration for MySQL database 【发布时间】:2014-01-10 12:16:15 【问题描述】:

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

Tomcat 7.0.47

休眠:4.2.7.Final

操作系统:Windows 7

context.xml

使用文档here 配置context.xml 文件中的数据源。

context.xml 位置:\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.DataSource 容器

这个改变也没有帮助。

更新 2 我终于可以使用 cmets 部分中的建议了。谢谢大家。

这是我的分析结果:

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

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

【问题讨论】:

您遗漏了您的web.xml 配置。您是否按照操作指南页面进行操作(resource-ref?) 我故意离开 web.xml 配置,因为我认为它不是必需的,因为我只在休眠级别工作。指示容器创建数据库连接池,context.xml配置不够吗? 更新 web.xml 似乎没有帮助;报告了同样的错误。我已使用此信息更新了我的原始帖子。 您如何/在哪个容器中执行测试类? 不确定这是否会影响它,但您的 jndi url 配置中缺少端口:url="jdbc:mysql://:/" 【参考方案1】:

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

【讨论】:

以上是关于MySQL数据库的Tomcat 7数据源配置的主要内容,如果未能解决你的问题,请参考以下文章

CentOS7下安装MySQL5.7安装与配置

在Tomcat中配置MySQL数据源

Mysql配置

MySQL设置时区和默认编码

对存在过期 binlog 的 MySQL5.7 添加从服务器

一.Mysql主从复制配置