JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » JDBC/SQL討論區 » Microsoft SQL Server  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 為何這樣就會出現錯誤呢,兩個程式碼的比較
KEO_001





發文: 13
積分: 0
於 2005-06-12 16:08 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
環境:作業系統:XP with SP2 JDK:1.5 DB:SQL 2000 with SP4
Tool:Eclipse
程式碼1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
 
public class Go {
 
  public static void main(String[] args) {
    for (int i = 0; i < 10000; i++) {//**回圈套在外面**
      try {
 
        Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
 
        String str = "jdbc:microsoft:sqlserver://localhost:1433"//路徑
            + ";databasename=XMLDB5";
 
        Connection con = DriverManager.getConnection(str, "sa", "1234");//建立本機連線
        Statement stmt = con.createStatement();//建立方法
 
        String ssql1 = "  INSERT INTO F (Q)  Values('keo')  ";
        stmt.executeUpdate(ssql1);
        System.out.println(i);
 
        con.close();
 
      } catch (Exception ex) {
        ex.printStackTrace();
      }
    }
  }
}


程式碼2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Go {
 
  public static void main(String[] args) {
 
    try {
 
      Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
 
      String str = "jdbc:microsoft:sqlserver://localhost:1433"//路徑
          + ";databasename=XMLDB5";
 
      Connection con = DriverManager.getConnection(str, "sa", "1234");//建立本機連線
      Statement stmt = con.createStatement();//建立方法
      for (int i = 0; i < 10000; i++) {//**迴圈套在裡面**
        String ssql1 = "  INSERT INTO F (Q)  Values('keo')  ";
        stmt.executeUpdate(ssql1);
        System.out.println(i);
      }
      con.close();
 
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
 
}


第一個程式碼跑到大約3900筆資料後會出現持續錯誤訊息
1
2
3
4
5
6
7
8
9
10
11
java.sql.SQLException: [Microsoft][SQLServer JDBC Driver]Error establishing socket.
  at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
  at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
  at com.microsoft.jdbc.sqlserver.tds.TDSConnection.<init>(Unknown Source)
  at com.microsoft.jdbc.sqlserver.SQLServerImplConnection.open(Unknown Source)
  at com.microsoft.jdbc.base.BaseConnection.getNewImplConnection(Unknown Source)
  at com.microsoft.jdbc.base.BaseConnection.open(Unknown Source)
  at com.microsoft.jdbc.base.BaseDriver.connect(Unknown Source)
  at java.sql.DriverManager.getConnection(Unknown Source)
  at java.sql.DriverManager.getConnection(Unknown Source)
  at Go.main(Go.java:30

可是第二個程式碼不會,會將10000筆資料都存進去SQL 2000
因為我的使用狀況是當某一個情形發生時,我必須存入當時的資料,可是情形出現時間會有間隔,所以我必須將呼叫資料庫寫成一個Class,在需要情況時,去new一個object。
也就是說,我去parse一份大約有13000個節點是text的節點,想要將這些資訊記錄到資料庫中,其整棵樹parse完大約需要0.6秒。
懇請各位大大,發表您們寶貴的意見。


reply to postreply to post
作者 Re:為何這樣就會出現錯誤呢,兩個程式碼的比較 [Re:KEO_001]
metavige

metavige

版主

發文: 2134
積分: 10
於 2005-06-13 08:38 user profilesend a private message to usersend email to metavigereply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你把建立 Connection 的程式碼包在迴圈?堶?
一定會有問題的

不可能你要執行一個 SQL 語法,就建立一條連線
不僅花時間,實際上也是不可行的
因為連線的建立與回收都必須要相當的花費 (Cost)

不然就不會有 DataSource 的產生了

事實上,如果你在執行的過程中有時間上的間隔
其實你就應該用 DataSource 來管理你的 Connection
這樣才不會有問題


reply to postreply to post
請各位新手參考 論壇規範Java 新手 FAQ
作者 Re:為何這樣就會出現錯誤呢,兩個程式碼的比較 [Re:KEO_001]
KEO_001





發文: 13
積分: 0
於 2005-06-13 11:30 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝Jakarta 版主熱情且有耐心的回覆小弟的問題

目前已經往connection pool的方面去想
如果我利用這種方法,將connection包在一個static裡,是否有什麼壞處?
1
2
3
4
5
6
7
8
9
10
11
  private static Connection conn;
  static {
    try {
      Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
      String str = "jdbc:microsoft:sqlserver://localhost:1433;databasename=One";
      Connection con = DriverManager.getConnection(str, "sa", "1234");//建立本機連線
      Statement stmt = con.createStatement();//建立方法
    } catch (Exception ex) {
      System.out.println("SQLException: " + ex.getMessage());
    }
  }


之後再直接使用它,似乎自己已經犯了嚴重的錯誤了吧,如無法關閉conn


reply to postreply to post
» JWorld@TW »  JDBC/SQL討論區 » Microsoft SQL Server

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8