【问题标题】:Java and database Connection. Which connection class is better and why?Java 和数据库连接。哪个连接类更好,为什么?
【发布时间】:2015-10-05 06:23:11
【问题描述】:

我正在使用 java 和一些数据库(oracle/sql)来存储一些信息。所以我决定创建一个 fixed 类来处理我的连接,最后我将返回一个 con 对象,以便我可以在其他类中使用它。

我拥有这些类的主要目的是能够从另一个类建立到数据库的连接。

请告诉我哪个更好,为什么以及是否可以改进。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectDB {

    private static ConnectDB con = new ConnectDB();

    private ConnectDB() {
        try{
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public Connection createCon() {
        Connection connection = null;
        try{
            connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","yy","yy");
        } catch (SQLException e) {
            System.out.println("Connection to db could not be done");
        }
        return connection;
    }

    public static Connection getConexiune() {
        return con.createCon();
    }
}

或者我可以使用这个类

import java.sql.*;

public class ConectDB {
    static   Connection con;

    public static Connection getConexiune() {
        return con;
    }  

    public static void main(String arg[]){

        try{
           Class.forName("oracle.jdbc.driver.OracleDriver");
           con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","yy","yy");
           System.out.println("cONNECTED");            
           con.close();
        }catch(Exception ex){ex.printStackTrace();}
    }   
}

哪个更好,为什么?

第一个示例是否使用单例设计模式?

【问题讨论】:

标签: java database oracle design-patterns jdbc


【解决方案1】:

虽然我不喜欢它们,但我认为第一比第二差。首先是一种Singleton,但它暴露了一个公共方法createCon,我认为它必须是受保护的或私有的。

第二个只在调用 main 方法后起作用,它只能服务一个连接。我不喜欢它。

为什么不考虑使用连接池?

编辑

考虑到您的评论,如果您想使用单例连接管理器,我将使用类似的东西:

public class ConnectDB {
    private static ConnectDB instance = null;

    static {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        }catch (ClassNotFoundException e) {
            //TODO manage exception
            e.printStackTrace();
        }
    }

    public static ConnectDB getInstance(){
        if(null == instance) 
            instance = new ConnectDB();

        return instance;
    }

    public Connection getConnection() {
        Connection connection = null;

        try{
            connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","yy","yy");
        }catch(SQLException e){
            //TODO manage exception
            e.printStackTrace();
        }

        return connection;      
    }
}

当然,我会为:

创建参数(用getter/setter封装):
  • 司机
  • 主持人
  • 端口
  • 数据库名称
  • 架构
  • 用户
  • 密码

这样,您的 getConnection() 方法将没有有线值。

【讨论】:

  • 我不是很好的广告连接池。有没有办法改进我的代码?我该怎么办?
【解决方案2】:

每个应用程序一个连接不是好主意。

  1. 拥有一个固定的连接池并管理该池。在释放连接时,不是关闭连接,而是返回池

  2. 您可以编写自己的连接池或实现Oracle UCP 池。看看UCP documentation

  3. 物理关闭不良连接(超时连接或断开连接)所需的内务管理机制

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2013-03-15
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多