当前位置: 首页 > 知识库问答 >
问题:

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

柯升
2023-03-14

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

  1. 如何在两个java类之间进行交互,例如如何将从servlet(coreServlet.java)中的HTML表单获得的变量用于核心。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

共有1个答案

田易安
2023-03-14

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

作为示例,这在Tomcat 7数据库连接池配置和JBoss 7数据库连接池配置中得到了很好的解释(在GlassFish和其他Web应用服务器上配置数据库连接池还有其他步骤,请注意,这在每台服务器上是不同的)。

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

>

  • 雄猫方式:

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

    最后,如果您已经配置了数据库连接池并且它正常工作,那么您在代码中要恢复连接所要做的就是调用OrialContext#lookup以使用其JNDI资源名称恢复资源。

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

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

  •  类似资料:
    • 在这段代码中,两个连接和断开是什么意思?导致停止,直到终止?

    • 问题内容: 例如,这是个好主意吗? 如果您在同一台服务器上有两个虚拟主机,一个虚拟主机,一个虚拟主机,并且使用不同的Apache DocumentRoots,则这将避免当include的来源未知并且可以在任何目录中时,不必包含绝对路径。 (注意:以下部分中的文件路径是相对于Web根目录的。实际上,它们类似于,其中Web根目录在哪里) 例如:我有一个/core/init.php,它是使用来自网站(,

    • 问题内容: 我正在设计一个大型数据库。在我的应用程序中,我将有很多行,例如,我目前有一个包含400万条记录的表。我的大多数查询都使用datetime子句来选择数据。索引mysql数据库中的datetime字段是一个好主意吗? 我正在努力保持数据库正常运行,并且查询运行平稳 此外,您认为创建高效数据库应该有什么主意? 问题答案: MySQL建议出于各种原因使用索引,包括消除条件之间的行:http :

    • 问题内容: 我创建了一个名为的模块,该模块提供了我在Python中经常使用的类和函数。其中一些需要导入的功能。在类/函数定义中导入所需内容的利弊是什么?它比模块文件的开头好吗?这是个好主意吗? 问题答案: 将 每个 导入文件放在文件顶部是最常见的样式。PEP 8推荐使用它,这是开始使用它的一个很好的理由。但这不是一时兴起,它具有优势(尽管不够重要,不足以使其他一切都构成犯罪)。它允许一目了然地找到

    • 问题内容: 我已经为JDBC连接编写了一个简单的包装程序,它可以工作,但是我想通过最佳实践来对其进行改进。它基本上有类似的方法,,,,,,和。为简单起见,我仅在此处发布前4种方法。 笔记: 可以重复使用同一查询对象,例如打开和关闭它,以及在再次打开之后。 我不是关闭每个查询的连接,而是关闭准备好的语句(这是正确的,或者我可以让准备好的语句保持打开状态,因为Connection对象会关闭它吗?) 当

    • 问题内容: 我已经多次听到您不应该执行或出于性能方面的考虑,但是无法深入了解有关它的更多信息。 我可以想象数据库随后将 所有 列都用于操作,这可能会导致性能下降,但是我不确定。有人有关于该主题的更多信息吗? 问题答案: 1.关于count(*)vs. count(其他) SQL是声明性的,您可以指定所需的 内容 。这不同于指定 如何 获得所需的东西。这意味着数据库引擎可以自由地以其认为最有效的方式