首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在处理jdbc时关闭连接的最佳实践是什么?

在处理jdbc时关闭连接的最佳实践是什么?
EN

Stack Overflow用户
提问于 2017-08-08 18:54:48
回答 1查看 2.1K关注 0票数 0

我使用prepareStatement()来防止sql注入。现在我遇到的问题是,使用下面的方法,我可以执行getConnection().prepareStatement()然后构建我的查询,但是我需要尝试-捕捉对getConnection()的每一个调用并在finally块中关闭它。createStatement().execute()似乎更好一些,因为我可以让客户端传入查询,然后在一个地方处理尝试捕获,但这不会阻止sql注入。通常最好的做法是什么?或者是否有其他方法可以阻止sql注入来构建查询?

代码语言:javascript
运行
复制
private static Connection getConnection() throws SQLException, URISyntaxException {
    URI dbUri = new URI(System.getenv("DATABASE_URL"));

    String username = dbUri.getUserInfo().split(":")[0];
    String password = dbUri.getUserInfo().split(":")[1];
    String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + dbUri.getPath();

    return DriverManager.getConnection(dbUrl, username, password);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-08 19:14:00

我将使用连接池,而不是每次创建和关闭连接。

使用tomcat服务器创建连接池应遵循的几个步骤

步骤-1.使用数据库连接详细信息更新TOMCAT_ROOT_DIR\conf\server.xml文件,如下所示:

代码语言:javascript
运行
复制
<?xml version='1.0' encoding='utf-8'?>
...
  <GlobalNamingResources>
    ...
    <Resource name="jdbc/JCGExampleDB" 
              global="jdbc/JCGExampleDB"
              factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
              auth="Container"
              type="javax.sql.DataSource"              
              username="test"
              password="test"
              driverClassName="com.mysql.jdbc.Driver"
              description="JCG Example MySQL database."
              url="jdbc:mysql://localhost:3306/JCGExampleDB"
              maxTotal="10"
              maxIdle="10"
              maxWaitMillis="10000"
              removeAbandonedTimeout="300"            
              defaultAutoCommit="true" />
     ...
  </GlobalNamingResources>

步骤2:使用的JdbcTemplate -您可以编写数据库连接实用程序类并获得如下所示的连接(这个步骤可以通过多种方式完成)。类似于context.xml文件或web.xml文件或如下所示)

代码语言:javascript
运行
复制
@Bean
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(dataSource());
    }

    @Bean
    public DataSource dataSource() {
        DataSource dataSource = new com.mchange.v2.c3p0.ComboPooledDataSource();
        try {
            JndiTemplate jndiTemplate = new JndiTemplate();
            dataSource = (DataSource)jndiTemplate.lookup("java:comp/env/jdbc/JCGExampleDB");
            } catch (NamingException e) {
            log.error("Unable to configure datasource: " + e.getStackTrace());
        }
        return dataSource;
    }

Edit1:使用单例类-没有JdbcTemplate:您可以在需要时从Singleton类获得连接。

代码语言:javascript
运行
复制
public class DatabaseConnectionManager {

    DataSource ds;

    public void init() {
        InitialContext initialContext = new InitialContext();
        ds = (javax.sql.DataSource)initialContext.lookup("jdbc/JCGExampleDB");
    }

    public Connection getConnection() {
        if(ds == null) init();

        return ds.getConnection();
    }
}

希望这能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45576021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档