【问题标题】:Tomcat6 MySql JDBC Datasource configurationTomcat6 MySql JDBC数据源配置
【发布时间】:2011-01-29 21:52:18
【问题描述】:

我一直使用 Spring 的依赖注入来获取数据源对象并在我的 DAO 中使用它们,但现在,我必须编写一个没有它的应用程序。

有了 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>

但是我如何在没有 Spring 或其他任何东西的情况下在我的 DAO 中使用数据源?我只使用 servlet 和 JSP。性能是非常重要的因素。

【问题讨论】:

    标签: java mysql tomcat jdbc datasource


    【解决方案1】:

    您可以将数据源声明为 JNDI 对象并通过 JNDI 查找检索数据源:

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

    如文档所述 herehere

    这是你所能得到的最简单的东西,所以从那时起,性能完全取决于你。

    【讨论】:

      【解决方案2】:

      信不信由你,人们在 Spring 之前就在编写应用程序,有些人仍然没有使用它 :) 在您的情况下,您可以使用 Tomcat 连接池(the documentation 中有一个完整的 MySQL 配置示例)。让我总结一下:

      首先,将您的驱动程序放入$CATALINA_HOME/lib

      然后,通过将资源声明添加到 Context,在 Tomcat 中配置 JNDI 数据源:

      <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>
      

      在您的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>
      

      并在您的应用程序中通过 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();
      

      请注意,此类lookup 通常编码在ServiceLocator 中(当您无法让DI 容器或框架为您注入它时)。

      【讨论】:

      • 我无法理解为什么这没有至少一个赞成票。
      • @BalusC:该死,我永远不会得到那个无名英雄徽章!当然是在开玩笑,非常感谢。
      • 大声笑。你必须有一个long journey
      • @BalusC 如果发生这种情况,我退出!
      • @PascalThivent 哪个位置更适合 Context 文件
      【解决方案3】:

      我以前在使用 sybase 时遇到错误,我在 WebContent 文件夹中缺少 META-INF 文件夹。将 context.xml 放入其中修复了错误 Cannot create JDBC driver of class '' for connect URL '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>
      

      【讨论】:

        猜你喜欢
        • 2011-02-27
        • 2018-03-22
        • 2014-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-18
        • 2014-10-31
        • 1970-01-01
        相关资源
        最近更新 更多