首先,最基本的連接方式:
private String url = "jdbc:odbc:Driver={SQL Server};Server=DELL-PC;Database=MedicalData";
private String user = "sa";
private String password = "netlab";
private Connection conn;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
conn = DriverManager.getConnection(url, user, password);
PreparedStatement partnames=conn.prepareStatement(sql);
rs=partnames.executeQuery();
Statement partnames=conn.createStatement();
partnames.executeUpdate(sql);
遇到問題:
查了很多文章以後,感覺應該是由於短時間大量訪問,導致沒有釋放資源,如rs,statement,conn等
這是查到了連接池 ,數據庫連接池:查到了鏈接 http://bbs.csdn.net/topics/340245414 這篇帖子的四樓方法,如下:
在util包中新建兩個文件,一個是DataSourceFactory.java,另一個是databaseresource.properties配置文件,還有幾個jar包,commons-dbcp-1.2.1.jar,commons-pool-1.3.jar,msbase.jar,mssqlserver.jar,msutil.jar,這5個jar包自己去網上下載下來
DataSourceFactory.java的內容如下
package util;
import org.apache.commons.dbcp.*;
import java.sql.*;
import java.util.*;
public class DataSourceFactory {
private static String PROPERTIES_FILE = "/util/databaseresource.properties";
private static DataSourceFactory instance = null;
private BasicDataSource ds1;
private DataSourceFactory() {
Properties prop = new Properties();
try {
prop.load(this.getClass().getResourceAsStream(PROPERTIES_FILE));
ds1 = (BasicDataSource)BasicDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSourceFactory getInstance() {
if(instance == null) {
instance = new DataSourceFactory();
}
return instance;
}
public Connection getConnection() {
Connection conn = null;
try {
conn = ds1.getConnection();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return conn;
}
}
databaseresource.properties中的內容如下:(去除//之後的註釋)
driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver
url=jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=friend //friend爲數據庫名
username=sa //數據庫連接用戶名
password=null //數據庫連接密碼
defaultAutoCommit=true //是否自動提交事務
maxActive=10 //連接池最大連接數
弄好後在程序中用
Connection conn = DataSourceFactory.getInstance().getConnection();
就可以等到數據庫連接了
於是有了我的代碼:
如下:
package com.k.sqlsever;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import util.DataSourceFactory;
public class SQLSeverLink {
private String url = "jdbc:odbc:Driver={SQL Server};Server=DELL-PC;Database=MedicalData";
private String user = "sa";
private String password = "netlab";
private Connection conn;
public void link()
{
try {
// Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
// conn = DriverManager.getConnection(url, user, password);
conn = DataSourceFactory.getInstance().getConnection();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public void closeLink()
{
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ResultSet select(String sql)
{
ResultSet rs= null;
try {
PreparedStatement partnames=conn.prepareStatement(sql);
rs=partnames.executeQuery();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return rs;
}
public void update(String sql)
{
try {
Statement partnames=conn.createStatement();
partnames.executeUpdate(sql);
System.out.println("update success!");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Connection conn = DataSourceFactory.getInstance().getConnection();
PreparedStatement partnames=conn.prepareStatement("SELECT * FROM dbo.MS_CHK_ALL WHERE id=1");
ResultSet rs=partnames.executeQuery();
while(rs.next())
{
String Data=rs.getString("chk_code");
System.out.println(Data);
}
} catch ( Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
這次又出現了新的問題,運行一小會以後,
[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.
我估計還是老問題,資源未釋放
忍無可忍,笨方法: 每處理100條以後,斷開連接,重連數據庫。sleep 100ms 再繼續進行
if(i%100==0)
{
serverLink.closeLink();
serverLink.link();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}