Java 和数据库连接。哪个连接 class 更好,为什么?
Java and database Connection. Which connection class is better and why?
我正在使用 java 和一些数据库 (oracle/sql
) 来存储一些信息。所以我决定创建一个 fixed class 来处理我的连接,我将 return 一个 con 对象结束,以便我可以在另一个 classes 中使用它。
我拥有这个 classes 的主要目的是能够从另一个 class.
建立到数据库的连接
请告诉我哪个更好,为什么以及是否可以改进。
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();
}
}
或者我可以用这个class
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();}
}
}
哪个更好,为什么?
第一个例子是否使用单例设计模式?
每个应用程序一个连接不是个好主意。
有一个固定的连接池并管理该池。在释放连接时,而不是关闭连接,return到池
你可以自己写连接池或者实现Oracle UCP池。看看 UCP documentation
物理关闭不良连接(超时连接或断开连接)所需的内务管理机制
虽然我不喜欢其中 none 个,但我认为第一个没有第二个差。首先是Singleton的一种,但是暴露了一个public方法createCon
,我觉得肯定是protected或者private的
第二个只有在调用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封装)用于:
- driver
- 主机
- 端口
- 数据库名
- 架构
- 用户
- 密码
这样你的 getConnection()
方法就没有绑定值了。
我正在使用 java 和一些数据库 (oracle/sql
) 来存储一些信息。所以我决定创建一个 fixed class 来处理我的连接,我将 return 一个 con 对象结束,以便我可以在另一个 classes 中使用它。
我拥有这个 classes 的主要目的是能够从另一个 class.
建立到数据库的连接请告诉我哪个更好,为什么以及是否可以改进。
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();
}
}
或者我可以用这个class
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();}
}
}
哪个更好,为什么?
第一个例子是否使用单例设计模式?
每个应用程序一个连接不是个好主意。
有一个固定的连接池并管理该池。在释放连接时,而不是关闭连接,return到池
你可以自己写连接池或者实现Oracle UCP池。看看 UCP documentation
物理关闭不良连接(超时连接或断开连接)所需的内务管理机制
虽然我不喜欢其中 none 个,但我认为第一个没有第二个差。首先是Singleton的一种,但是暴露了一个public方法createCon
,我觉得肯定是protected或者private的
第二个只有在调用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封装)用于:
- driver
- 主机
- 端口
- 数据库名
- 架构
- 用户
- 密码
这样你的 getConnection()
方法就没有绑定值了。