简体   繁体   English

Tomcat6 MySql JDBC数据源配置

[英]Tomcat6 MySql JDBC Datasource configuration

I've always used Spring's dependency injection to get datasource objects and use them in my DAOs, but now, I have to write an app without that. 我总是使用Spring的依赖注入来获取数据源对象并在我的DAO中使用它们,但现在,我必须编写一个没有它的应用程序。

With Spring I can write something like this: 有了Spring,我可以这样写:

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://127.0.0.1/app?characterEncoding=UTF-8" />
    <property name="username" value="u" />
    <property name="password" value="p" />
</bean>

But how can I use datasource in my DAOs without Spring or anything? 但是如何在没有Spring或任何东西的情况下在我的DAO中使用数据源? I'm using servlets and JSPs only. 我只使用servlet和JSP。 Performance is very important factor. 性能是非常重要的因素。

Believe it or not, people were writing applications before Spring and some are still not using it :) In your case, you could use Tomcat connection pool (and there is a complete configuration example for MySQL in the documentation ). 信不信由你,人们在Spring之前编写应用程序,有些人仍然没有使用它:)在你的情况下,你可以使用Tomcat连接池(在文档中有一个完整的MySQL配置示例)。 Let me summarize it: 让我总结一下:

First, put your driver in $CATALINA_HOME/lib . 首先,将您的驱动程序放在$CATALINA_HOME/lib

Then, configure a JNDI DataSource in Tomcat by adding a declaration for your resource to your Context : 然后,通过向您的Context添加资源声明,在Tomcat中配置JNDI DataSource:

<Context path="/DBTest" docBase="DBTest"
        debug="5" reloadable="true" crossContext="true">

    <!-- maxActive: Maximum number of dB connections in pool. Make sure you
         configure your mysqld max_connections large enough to handle
         all of your db connections. Set to -1 for no limit.
         -->

    <!-- maxIdle: Maximum number of idle dB connections to retain in pool.
         Set to -1 for no limit.  See also the DBCP documentation on this
         and the minEvictableIdleTimeMillis configuration parameter.
         -->

    <!-- maxWait: Maximum time to wait for a dB connection to become available
         in ms, in this example 10 seconds. An Exception is thrown if
         this timeout is exceeded.  Set to -1 to wait indefinitely.
         -->

    <!-- username and password: MySQL dB username and password for dB connections  -->

    <!-- driverClassName: Class name for the old mm.mysql JDBC driver is
         org.gjt.mm.mysql.Driver - we recommend using Connector/J though.
         Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver.
         -->

    <!-- url: The JDBC connection url for connecting to your MySQL dB.
         -->

  <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/javatest"/>

</Context>

Declare this resource in your web.xml : web.xml声明此资源:

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
  <description>MySQL Test App</description>
  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TestDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

And get the datasource with a JNDI lookup in your application: 并在您的应用程序中使用JNDI查找获取数据源:

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/TestDB");

Connection conn = ds.getConnection();
... use this connection to access the database ...
conn.close();

Note that such lookup is usually coded in a ServiceLocator (when you can't have aa DI container or a framework inject it for you). 请注意,此类lookup通常在ServiceLocator编码(当您无法使用DI容器或框架为您注入时)。

I used to get error with sybase, I had missing META-INF folder in WebContent folder. 我以前用sybase搞错了,我在WebContent文件夹中缺少META-INF文件夹。 Putting context.xml in that fixed the error Cannot create JDBC driver of class '' for connect URL 'null'... // www.abbulkmailer.com My context.xml looks like 将context.xml放入其中修复错误无法为连接URL创建类''的JDBC驱动程序'null'... // www.abbulkmailer.com我的context.xml看起来像

<Context path="/reports" docBase="reports" debug="5" reloadable="true" crossContext="true">
<Resource name='jdbc/ASCSybaseConnection'
      auth='Container'
      type='javax.sql.DataSource'
      username='fdd'
      password='555'
      driverClassName='com.sybase.jdbc2.jdbc.SybDriver'
      maxActive='100'
      maxIdle='100'
      minIdle='10'
      removeAbandoned="true"
      removeAbandonedTimeout="60"
      testOnBorrow="true"
      logAbandoned="true"
      url='jdbc:sybase:Tds:1.3.4.5:654/DB'/> 
</Context>

You can declare your data source as a JNDI object and retrieve a datasource via a JNDI lookup: 您可以将数据源声明为JNDI对象,并通过JNDI查找检索数据源:

DataSource ds = (DataSource)
  envCtx.lookup("jdbc/EmployeeDB");

as documented here and here . 如此此处所述

That's as bare-bones as you can get, so from there on, performance is completely up to you. 这就像你可以得到的一样,所以从那以后,性能完全取决于你。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM