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

» JWorld@TW » Java SE 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 存取資料庫中BLOB型態的問題
weberhwang





發文: 45
積分: 0
於 2019-11-19 14:15 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
大家好

我的環境是jdk 1.8

有一個問題請教各位先進,
一般用java存取資料庫時,若要一次讀出多個欄位的情況下,大多會額外設計一個Java類別,
定義多個屬性來對應資料庫欄位。
平常在使用時也沒遇到什麼問題,但這次因為有使用到BLOB型態的資料庫欄位。
所以我在TestClass也開了一個對應的BLOB欄位。

一般在建立資料庫connection後,我偏向在取得資料後,盡早先關閉connection,不要開啟connection太久。
然後後續再利用取得到的物件(即TestClass之實例)進行邏輯處理。

但這次卻發生了問題,
在下面程式碼中的 excel.getBytes(1, (int)excel.length()),//attach_file_stream_1,
這一行會發生錯誤,錯誤原因是跟我說 connection 已被關閉,故無法取得資料。
但前面的兩行卻不會發生問題。
regName, //toname,
stateEmail, //toemail,

這個讓我想到 java 是一律是「傳值」,只是在「參考型別」時,傳的是「參考」的值。
而基本型別對 java而言,它的值,就是我們平常認知的值,不是類似參考的東西。
若用這個角度來解釋,我大概能了解,為何BLOB那邊會出錯。
只是反而衍生出其它問題
(1)String也是參考型別,不是基本型別,但卻能正常使用,這是為何?例如下面兩行就不會出錯
regName, //toname,
stateEmail, //toemail,
(2)假如我想提前關閉連線,那像BLOB這種參考型別,我要如何事先複製保存?用clone()?
(3)承(2),使用clone()這種複製行為,在這種情況下是大家常用的嗎?會不會吃掉太多記憶體空間?


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
 
public class Client {
  public static void main(String[] args){
    try {
      Blob excel = null;
      String stateEmail = null;
      String regName = null;
      
      //取得系統日期
      Date date = new Date();
      SimpleDateFormat ft = new SimpleDateFormat ("yyyyMMdd");
      Calendar calendar = Calendar.getInstance();
      calendar.setTime(date);
      date = calendar.getTime(); 
      
      //讀取excel
      String sql = "select " + 
                   "  FILE1, " + 
                   "  reg_name, " + 
                   "  STATEMENT_EMAIL " + 
                   "from table1 " + 
                   "where " + 
                   "  mid = ? " + 
                   "  and export_date = ? ";
      SinopacPWDManager spwdm = new SinopacPWDManager();
      Connection conn = spwdm.getOracleCon("uat_db");
      PreparedStatement pstmt = null;
      ResultSet rs = null;
 
      pstmt = conn.prepareStatement(sql);
      pstmt.setString(1, "807999912340002");
      pstmt.setString(2, "20190415");
      rs = pstmt.executeQuery(); 
      
      TestClass obj1 = new TestClass();
      
      if (rs != null) { 
        while(rs.next()){
          excel = rs.getBlob(1);
          stateEmail = rs.getString(2);
          regName = rs.getString(3); 
        }
      }
      //提前關閉資料庫連線,釋放資源
      rs.close();
      pstmt.close();
      conn.close();
 
      SendNow locator = new SendNowLocator();
      locator.setSendNowSoapAddress("http://172.0.0.1/local_api/SendNow.asmx");
      SendNowSoapStub stub = (SendNowSoapStub)locator.getSendNowSoap();
        
      boolean result = stub.sendNowAPI(
                         "00010", //project_category_code,
                         regName, //toname, 
                         stateEmail, //toemail, 
                         "xxxx", //fromname, 
                         "xxxx@mail.com",//fromemail, 
                         "測試表頭", //subject, 
                         "20191115",//content, 
                         "CARD", //channel, 
                         "00020", //PGCode, 
                         "123",//custID, 
                         excel.getBytes(1, (int)excel.length()),//attach_file_stream_1, <<這行會出錯,說因為connection已關閉
                         "test.pdf",//file_name_1, 
                         null,//attach_file_stream_2, 
                         "",//file_name_2, 
                         null,//attach_file_stream_3, 
                         "",//file_name_3, 
                         null,//attach_file_stream_4, 
                         "",//file_name_4, 
                         null,//attach_file_stream_5, 
                         "",//file_name_5, 
                         "",//replyemail, 
                         "0"//priority
                         );
       System.out.println("Result is: " + result);
 
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
    }
  }
}


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
import java.sql.Blob;
 
public class TestClass {
  private Blob excel = null; 
  private String regName = null;
  private String stateEmail = null;
 
  public Blob getExcel() {
    return excel;
  }
  public void setExcel(Blob excel) {
    this.excel = excel;
  }
  public String getRegName() {
    return regName;
  }
  public void setRegName(String regName) {
    this.regName = regName;
  }
  public String getStateEmail() {
    return stateEmail;
  }
  public void setStateEmail(String stateEmail) {
    this.stateEmail = stateEmail;
  }
  
}


weberhwang edited on 2019-11-19 16:37
reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
500 存取資料庫中BLOB型態的問題 weberhwang 4584 2019-11-19 14:15
» JWorld@TW »  Java SE 討論區

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

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8