什么是最好的方法?,我需要连接许多远程数据库来解决来自Restful Web服务的许多请求。我在想两个解决方案:
每个远程数据库有一个数据源,每个数据源的连接就像一个单例模式。
每个远程数据库有一个简单的连接,只需要一个单独的模式来连接每个数据库。
第一种方法的一个例子是这样的(víammsdn):
import java.sql.*;
import com.microsoft.sqlserver.jdbc.*;
public class connectDS {
public static void main(String[] args) {
// Declare the JDBC objects.
Connection con = null;
CallableStatement cstmt = null;
ResultSet rs = null;
try {
// Establish the connection.
SQLServerDataSource ds = new SQLServerDataSource();
ds.setUser("UserName");
ds.setPassword("*****");
ds.setServerName("localhost");
ds.setPortNumber(1433);
ds.setDatabaseName("AdventureWorks");
con = ds.getConnection();
// Execute a stored procedure that returns some data.
cstmt = con.prepareCall("{call dbo.uspGetEmployeeManagers(?)}");
cstmt.setInt(1, 50);
rs = cstmt.executeQuery();
// Iterate through the data in the result set and display it.
while (rs.next()) {
System.out.println("EMPLOYEE: " + rs.getString("LastName") +
", " + rs.getString("FirstName"));
System.out.println("MANAGER: " + rs.getString("ManagerLastName") +
", " + rs.getString("ManagerFirstName"));
System.out.println();
}
}
// Handle any errors that may have occurred.
catch (Exception e) {
e.printStackTrace();
}
finally {
if (rs != null) try { rs.close(); } catch(Exception e) {}
if (cstmt != null) try { cstmt.close(); } catch(Exception e) {}
if (con != null) try { con.close(); } catch(Exception e) {}
System.exit(1);
}
}
}
对于第二种方法,单例示例可以是:
public java.sql.Connection conn;
private static Statement statement;
public static MysqlConnect db;
private MysqlConnect() {
String url= "jdbc:mysql://localhost:3306/";
String dbName = "Banco";
String driver = "com.mysql.jdbc.Driver";
String userName = "root";
String password = "123456";
try {
Class.forName(driver).newInstance();
this.conn = (java.sql.Connection)DriverManager.getConnection(url+dbName,userName,password);
System.out.println("Connected to DataBase: " + dbName);
}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException sqle) {
System.out.println("Error Inesperado en MysqlConnect" + sqle.toString());
}
}
/**
*Method for connect to a database
* @return MysqlConnect Database connection object
*/
public static synchronized MysqlConnect getDbCon() {
if ( db == null ) {
try {
db = new MysqlConnect();
statement = db.conn.createStatement();
} catch (SQLException ex) {
Logger.getLogger(MysqlConnect.class.getName()).log(Level.SEVERE, null, ex);
}
}
System.out.println("Connection to DB: OK");
return db;
}
答案 0 :(得分:0)
这取决于数据库与查询之间的关系。如果您有大量查询要访问单个数据库(例如用户数据库),那么您将需要多个连接,否则您将最终阻止该资源上的线程。
最灵活的方法是为每个远程数据库建立一个连接池,并根据在任何单个REST事务中查询的可能性,配置每个远程数据库以使它们具有适当数量的连接。
一个好的起点可能是查看Tomcat数据源池。请注意,无论您是否将Tomcat用作Web服务器,都可以使用它。
答案 1 :(得分:0)
多个线程不能同时使用Connection
,而DataSource
可以使用{{1}}。