JAVA連接SQLServer基礎,以及5分鐘之內讀+寫20萬條數據(40萬條操作),遇到的問題


首先,最基本的連接方式:

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

遇到問題:

[Microsoft][ODBC SQL Server Driver]連接佔線導致另一個 hstmt

查了很多文章以後,感覺應該是由於短時間大量訪問,導致沒有釋放資源,如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();
			}
		}




發佈了87 篇原創文章 · 獲贊 61 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章