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.xml
。 context.xml
中的条目足以让它工作。最初我使用独立的 Java 类(main 方法)进行测试,因此出现了上面提到的错误。它不能作为无法访问容器外所需上下文的独立类工作;我一个明显的菜鸟错误。当我从 UI 进行测试时,它运行良好。
特别感谢 Joe Rinehart 提出了正确的问题! +1
【问题讨论】:
您遗漏了您的web.xml
配置。您是否按照操作指南页面进行操作(resource-ref
?)
我故意离开 web.xml 配置,因为我认为它不是必需的,因为我只在休眠级别工作。指示容器创建数据库连接池,context.xml配置不够吗?
更新 web.xml 似乎没有帮助;报告了同样的错误。我已使用此信息更新了我的原始帖子。
您如何/在哪个容器中执行测试类?
不确定这是否会影响它,但您的 jndi url 配置中缺少端口:url="jdbc:mysql://听起来您可能没有在与 Tomcat 本身相同的上下文/容器/jvm 中执行测试类。我会检查一下。
【讨论】:
以上是关于MySQL数据库的Tomcat 7数据源配置的主要内容,如果未能解决你的问题,请参考以下文章