一尘不染

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

jsp

我是servlet和数据库的新手core.java,我有一个包含JDBC连接代码的coreServlet.java文件,在同一个目录中,我有一个文件,该文件的格式来自HTML页面。我的问题是:

  1. 如何在两个Java类之间进行交互,例如,如何使用从servlet(coreServlet.java)中的HTML表单获取的变量到core.java文件,以便将其存储在数据库中?
  2. 将我的jdbc连接代码放在coreServlet.java中是一个更好的主意吗?

我的项目结构如下:

  - 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

阅读 341

收藏
2020-06-08

共1个答案

一尘不染

数据库连接的数据应该在你的JNDI数据源,如果你使用一个连接池,但它会更好, 从来没有
在一个班。由于您的服务器是Web应用程序,因此请注意,连接池配置在很大程度上取决于Web应用程序服务器。

作为示例,这在Tomcat 7数据库连接池配置JBoss
7数据库连接池配置中得到了
很好的解释(还有其他步骤可以在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...)
2020-06-08