作者aegis105 (NO)
看板java
標題[問題] Spring JDBC可以控制特定Connection嗎?
時間Tue Mar 8 20:07:47 2016
各位JAVA前輩好
先描述一下目前狀況
--
架構:
Web application使用Spring框架
而Spring JDBC的Datasource有使用connection pool
--
需求:
DB已經有一個table 該table是空的 是一個temp table
但我不知道這種規則叫做什麼 以下簡單舉個例子
EX:當有一個connection對該table insert 100筆
connection還沒斷的時候裡面資料都存在
等到該connection斷了 table即會自動清空
而我要使用Spring JDBC 對其進行操作
--
現況:
因為Spring JDBC中的jdbctemplate會幫我們管理connection
但是我需要使用特定單一的connection 一口氣做完所有動作
做完之後將該connection給close 使table自動清空
目前的想法是:
//取得單一連線?
Connection con = jdbctemplate.getdatasource().getconnection();
//做完所有動作
//關閉此連線 讓table自動清空
con.close();
問題:
1.請問若像上面的作法是否就可以達成控制單一connection的需求呢?
2.因為底層是connection pool 是否會造成其他影響?
或者...事情根本不是我想的這樣
懇請各位前輩不吝指教 謝謝!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.24.60.237
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1457438870.A.025.html
1F:→ ssccg: temp table是在commit的時候清空,跟connection無關 03/08 20:41
2F:→ ssccg: 你需要的是Transaction 03/08 20:42
3F:→ ssccg: 沒有用transaction時JdbcTemplate每個動作會auto commit 03/08 20:45
抱歉我補充一下
我要insert資料至temp table A 此時會commit
然後再和table B 作join 取出需要的資料
然後A就不需要再用了 當該Connection斷了後 A自動清空 這是DB作的
同一個Connection連線&中斷 都是DB判斷的
謝謝一樓提供的意見!
※ 編輯: aegis105 (114.24.60.237), 03/08/2016 20:56:19
4F:→ ssccg: 忘了問哪種DB,因為你說的像oracle的所以上面是說oracle的 03/08 21:13
5F:→ ssccg: 你table A資料作完就不用了,那為什麼要commit? 03/08 21:13
是oracle沒錯
因為資料筆數非常大量
temp table A的機制是DBA建議&設計的
先將大量資料commit到A 之後和B(資料筆數更多)join 得出結果
不知道是否有回答到您的問題 或是其實有更好作法呢
※ 編輯: aegis105 (114.24.60.237), 03/08/2016 21:29:36
※ 編輯: aegis105 (114.24.60.237), 03/08/2016 21:32:47
6F:→ ssccg: oracle的temp table是在commit(結束transaction時清空) 03/08 21:41
7F:→ ssccg: 所以就是開一個transaction中作完insert、join select 03/08 21:42
8F:→ ssccg: 之後再commit 03/08 21:42
9F:→ ssccg: 我猜你把commit當成insert... 03/08 21:44
疑.. 但我沒有搞混commit和insert
使用的方式和ss大說的有點像又不太一樣
我今天測試的方式:
用一個connection > insert 1筆資料 > commit
> select確實有那一筆
中斷connection > 重新開connection
> select table是空的
有點混亂啊..
※ 編輯: aegis105 (114.24.60.237), 03/08/2016 22:19:44
10F:→ yyc1217: 建立connection的成本蠻大的 如果太頻繁的確會造成影響 03/08 23:04
11F:→ yyc1217: 這也是為什麼有connection pool 用query清空也許比較好 03/08 23:04
12F:→ yyc1217: 或是每次建立不同的temp表 db再用排程刪掉 03/08 23:06
13F:→ adrianshum: Oracle temp table 建立時可指明commit 或connection 03/09 01:10
14F:→ adrianshum: close 時清空。另,因為connection pool 並不會真的c 03/09 01:10
15F:→ adrianshum: lose connection,類似情況下不建議用後者 03/09 01:10
16F:→ ssccg: 我不知道可以設成connection close時清空,不過因為pool的 03/09 02:56
17F:→ ssccg: 關係通常是用commit時清空的用法吧 03/09 02:56
18F:→ ssccg: 如果是connection時清空,在用pool的情況下你只能自己每個 03/09 02:56
19F:→ ssccg: transaction去做trucate了 03/09 02:57
20F:→ ssccg: 只要有用connection pool,上層取到的connection都是wrap過 03/09 02:58
21F:→ ssccg: 的,你close都只是把connection還回pool,不能真的關掉 03/09 02:58
22F:→ ssccg: 可以要求改DB定義的話去換成on commit delete吧 03/09 03:03
23F:推 cug990617: 你可以試著寫一個Procedure,把資料送進去後再處理 03/09 13:23
24F:推 j16598231: 試試用batch? 03/09 21:36
25F:推 kiwatami: temp table可以用stored procedure開 執行完就消失了 03/10 12:02
26F:→ kiwatami: 不需要管連線 要做這種一堆處理的寫在裡面速度會快點 03/10 12:02