处理jdbc时关闭连接的最佳做法是什么

时间:2017-08-08 18:54:48

标签: java jdbc

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

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);
}

1 个答案:

答案 0 :(得分:1)

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

我们应该遵循一些步骤来使用tomcat服务器创建连接池

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

<?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步: 使用Spring的JdbcTemplate -  您可以编写数据库连接实用程序类并获取如下所示的连接(此步骤可以通过多种方式完成..如context.xml文件或web.xml文件或如下所示)

@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: 使用Singleton类 - 没有JdbcTemplate:您可以在需要时从Singleton类获得连接。

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();
    }
}

希望这会有所帮助......