2011年12月21日 星期三

MSSQL 2005 jdbc.SQLServerException

發生情形:
程式持續開啟與關閉大量連線至MSQQL DB時,短時間內程式可以順利執行,但過一段時間後,程式會一直跑出SQLServerException,資料也無法寫入DB
  
錯誤訊息:
INFO   | jvm 1    | 2011/12/16 16:09:49 | com.microsoft.sqlserver.jdbc.SQLServerException: 連接到主機 localhost 的 TCP/IP 連接已經失敗。錯誤: "Address already in use: connect。請確認連接屬性並檢查 SQL Server 的執行個體是否正在主機上執行,而且通訊埠可接收 TCP/IP 連接,同時防火牆也未封鎖連到通訊埠的 TCP 連接。"。
 INFO   | jvm 1    | 2011/12/16 16:09:49 |     at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171)
INFO   | jvm 1    | 2011/12/16 16:09:49 |     at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1033)
INFO   | jvm 1    | 2011/12/16 16:09:49 |     at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:817)
INFO   | jvm 1    | 2011/12/16 16:09:49 |     at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:700)
INFO   | jvm 1    | 2011/12/16 16:09:49 |     at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:842)
INFO   | jvm 1    | 2011/12/16 16:09:49 |     at java.sql.DriverManager.getConnection(DriverManager.java:582)
INFO   | jvm 1    | 2011/12/16 16:09:49 |     at java.sql.DriverManager.getConnection(DriverManager.java:207)

排除方式
*修改MS SQL DB主機TcpTimedWaitDelay參數值
TcpTimedWaitDelay 值決定必須經過多久之後,TCP/IP 才能釋出已關閉的連線,以及重複使用它的資源。 此關閉和釋出的間隔稱為 TIME_WAIT 狀態,或是區段生命期限上限 (2MSL) 狀態的兩倍。 在這段時間內,通往用戶端和伺服器的連線重新開啟的成本,比建立新的連線低。 縮減這個項目的值時,TCP/IP 可以更快釋出已關閉的連線,以提供更多資源給新的連線。 如果執行中的應用程式需要快速釋出、建立新連線,或多個連線在 TIME_WAIT 狀態中造成通訊量太低,因而需要進行調整的話,請調整這個參數。
預設值是 0xF0,這會將等待時間設為 240 秒(4 分鐘)。
最小的建議值是 0x1E,將等待時間設為 30 秒。請利用這個程序來檢視或自訂您的值。
  1. 啟動 regedit 指令,導覽至 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parametersregistry 子鍵,然後建立一個新的 REG_DWORD 值,稱為 TcpTimedWaitDelay
  2. 請將這個值設為十進位的 30,也就是 Hex0x0000001e。這個值將等待時間設為 30 秒。
  3. 關閉登錄編輯器。
  4. 停止並重新啟動系統。


Data type Range Default value
REG_DWORD          0x1E 0x12C ( 30–300 seconds )      0xF0 ( 240 seconds = 4 minutes )


MS SQL參考網站:http://technet.microsoft.com/en-us/library/cc938217.aspx

2011年12月14日 星期三

[java] MSSQL DB(2005)連線

步驟1:下載MSSQL JDBC driver
        下載網址:http://msdn.microsoft.com/zh-tw/data/aa937724%28en-us%29.aspx
步驟2:將jar檔放入java參考路徑中
       使用cmd編譯:檔案放於JAVAHOME\jre\lib\ext資料夾中
       備註:解壓縮後會有兩個jar檔,要依照使用版本選擇jar檔,不能兩個都放(...MSSQL你好難相處!切~),程式編譯時無法判讀使用哪個會發生錯誤,2005使用sqljdbc4.jar

程式碼參考:

import java.util.*;
import java.sql.*;
import java.text.*;

public class MssqlTest {

    public static void main(String args[]){
        String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
        String url = "jdbc:sqlserver://localhost:1433;user=admin;password=admin;databaseName=DBName";
        try {
            Class.forName(driver);
            java.sql.Connection conn=DriverManager.getConnection(url );
       
            if(conn != null && !conn.isClosed()) {
            PreparedStatement pstmt = conn.prepareStatement("INSERT INTO TableNAme VALUES(?, ?, ? ,?,?)");
            pstmt.setString(1, "String1");
            pstmt.setString(2, "String2");
            pstmt.setString(3, "String3");
            pstmt.setString(4, "String4");
            pstmt.setString(5, "String5");

            pstmt.executeUpdate();
            pstmt.clearParameters();
            System.out.println("資料庫連線測試成功!");
            conn.close();
            }
                   
        }
        catch(ClassNotFoundException e) {
            System.out.println("找不到驅動程式類別");
            e.printStackTrace();
        }
        catch(SQLException e) {
            e.printStackTrace();
        }

    }
}

[java] String轉date CST格式轉換



import java.text.SimpleDateFormat;//時間格式轉換用
import java.util.*;//要使用Locale.US就必須要有java.util.Calendar
import java.text.*;

public class Datetime {

    public static void main(String args[]){
        //轉換時間格式
        java.util.Date date = new java.util.Date();
        java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
        //Locale.US一定要加,不然parse時會成功,但是會一直拋出ParseException
        java.text.SimpleDateFormat sdf1 = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
           
        try    {
            date = df.parse("Wed Dec 07 17:04:46 CST 2011");          //將字串解析為日期
            } catch (ParseException e){                       //捕捉ParseException例外物件,必加
            System.out.println(e.toString());
            }
            String Result =sdf1.format(date);
            System.out.println(Result);
        }
}


時間格式轉換字元代表如下:

字母
日期或時間元素
表示
示例
G
Era 標誌符
AD
y
1996; 96
M
年中的月份
July; Jul; 07
w
年中的周數
27
W
月份中的周數
2
D
年中的天數
189
d
月份中的天數
10
F
月份中的星期
2
E
星期中的天數
Tuesday; Tue
a
Am/pm 標記
PM
H
一天中的小時數(0-23
0
k
一天中的小時數(1-24
24
K
am/pm 中的小時數(0-11
0
h
am/pm 中的小時數(1-12
12
m
小時中的分鐘數
30
s
分鐘中的秒數
55
S
毫秒數
978
z
時區
Pacific Standard Time; PST; GMT-08:00
Z
時區
-0800


參考資料:http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html