将jdbc连接代码放在servlet类中是个好主意吗?

时间:2013-04-12 21:36:17

标签: java jsp servlets jdbc

我是servlet和database的新手。我有一个core.java文件,其中我有一个JDBC连接代码。在同一目录中,我有一个coreServlet.java文件,它从HTML页面获取表单值。我的问题是:

  1. 如何在两个java类之间进行交互,例如,如何将我从servlet(coreServlet.java)中的HTML表单中获得的变量用于我的core.java文件,以便将其存储在我的数据库中? / LI>
  2. 将我的jdbc连接代码放在coreServlet.java中更好吗?
  3. 我的项目结构如下:

      - aarya(project name)   
            |
             - WEB-INF
                     |
            |         -web.xml
            -src
               |
              -pkg
               |
                -CoreServlet.java(servlet to interact HTML form)
                -Main.java
                -Core.java(jdbc code is here to interact database)
            |
            -html
                |
                - core.html
            |
            - css
                 |
                 -core.css
    
            |
            -javascript
                      |
                       -core.js
            |
            - lib
            |
            -index.html
    

1 个答案:

答案 0 :(得分:2)

数据库连接数据应该在您的JNDI数据源中,如果您在类中使用连接池但从不会更好。由于您的Web应用程序是Web应用程序,请注意连接池配置在很大程度上取决于Web应用程序服务器。

作为示例,在Tomcat 7 Database Connection Pool configurationJBoss 7 Database Connection Pool configuration中已经很好地解释了这一点(在GlassFish和其他Web应用程序服务器上配置数据库连接池还有其他步骤,请注意,每个服务器上的这一点都不同)。

从这两个示例中,您可以看到您将拥有一个XML文件,您可以在其中放置连接属性:数据库URL,用户,密码,最小和最大池连接大小(将打开与数据库的连接数)

  • Tomcat方式:

    <Resource name="jdbc/ProjectX" auth="Container"
        type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/projectx"
        username="user" password="password" maxActive="20" maxIdle="10" maxWait="-1"/>
    
  • JBoss方式:

    <datasource jndi-name="jdbc/ProjectX" pool-name="MySqlDS">
            <connection-url>jdbc:mysql://localhost:3306/projectx</connection-url>
            <driver>com.mysql</driver>
            <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
            <pool>
                <min-pool-size>10</min-pool-size>
                <max-pool-size>100</max-pool-size>
                <prefill>true</prefill>
            </pool>
            <security>
                <user-name>user</user-name>
                <password>password</password>
            </security>
            <statement>
                <prepared-statement-cache-size>32</prepared-statement-cache-size>
                <share-prepared-statements/>
            </statement>
    </datasource>
    <drivers>
        <driver name="com.mysql" module="com.mysql">
            <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
        </driver>
    </drivers>
    

最后,如果您已配置数据库连接池并且它可以正常工作,则您需要在代码中执行的所有操作都是调用InitialContext#lookup以使用其JNDI资源名称恢复资源。

知道这一点,在配置JNDI资源以连接到名为“jdbc / ProjectX”的MySQL数据库之后,您可以拥有一个恢复Connection的类,如下所示:

public class DatabaseConnectivity {
    public static Connection getConnection() throws NamingException, SQLException {
        InitialContext cxt = new InitialContext();
        DataSource ds = (DataSource) cxt.lookup("java:/comp/env/jdbc/ProjectX" );
        return ds.getConnection();
    }
}

顺便说一句,我会使用不同的名称来了解类的功能组。例如:

src
- edu.home.controller.servlet
  + CoreServlet.java
- edu.home.controller.filter
  + SessionFilter.java
- edu.home.model.entity
  + AnEntity.java
  + AnotherEntity.java
- edu.home.model.database
  + DatabaseConnectivity.java
- edu.home.model.service
  + AnEntityService.java
  + AnotherEntityService.java
(and on and on...)