[問題] Spring JDBC可以控制特定Connection嗎?

看板java作者 (NO)時間9年前 (2016/03/08 20:07), 9年前編輯推噓3(3023)
留言26則, 6人參與, 最新討論串1/1
各位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://www.ptt.cc/bbs/java/M.1457438870.A.025.html

03/08 20:41, , 1F
temp table是在commit的時候清空,跟connection無關
03/08 20:41, 1F

03/08 20:42, , 2F
你需要的是Transaction
03/08 20:42, 2F

03/08 20:45, , 3F
沒有用transaction時JdbcTemplate每個動作會auto commit
03/08 20:45, 3F
抱歉我補充一下 我要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

03/08 21:13, , 4F
忘了問哪種DB,因為你說的像oracle的所以上面是說oracle的
03/08 21:13, 4F

03/08 21:13, , 5F
你table A資料作完就不用了,那為什麼要commit?
03/08 21:13, 5F
是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

03/08 21:41, , 6F
oracle的temp table是在commit(結束transaction時清空)
03/08 21:41, 6F

03/08 21:42, , 7F
所以就是開一個transaction中作完insert、join select
03/08 21:42, 7F

03/08 21:42, , 8F
之後再commit
03/08 21:42, 8F

03/08 21:44, , 9F
我猜你把commit當成insert...
03/08 21:44, 9F
疑.. 但我沒有搞混commit和insert 使用的方式和ss大說的有點像又不太一樣 我今天測試的方式: 用一個connection > insert 1筆資料 > commit > select確實有那一筆 中斷connection > 重新開connection > select table是空的 有點混亂啊.. ※ 編輯: aegis105 (114.24.60.237), 03/08/2016 22:19:44

03/08 23:04, , 10F
建立connection的成本蠻大的 如果太頻繁的確會造成影響
03/08 23:04, 10F

03/08 23:04, , 11F
這也是為什麼有connection pool 用query清空也許比較好
03/08 23:04, 11F

03/08 23:06, , 12F
或是每次建立不同的temp表 db再用排程刪掉
03/08 23:06, 12F

03/09 01:10, , 13F
Oracle temp table 建立時可指明commit 或connection
03/09 01:10, 13F

03/09 01:10, , 14F
close 時清空。另,因為connection pool 並不會真的c
03/09 01:10, 14F

03/09 01:10, , 15F
lose connection,類似情況下不建議用後者
03/09 01:10, 15F

03/09 02:56, , 16F
我不知道可以設成connection close時清空,不過因為pool的
03/09 02:56, 16F

03/09 02:56, , 17F
關係通常是用commit時清空的用法吧
03/09 02:56, 17F

03/09 02:56, , 18F
如果是connection時清空,在用pool的情況下你只能自己每個
03/09 02:56, 18F

03/09 02:57, , 19F
transaction去做trucate了
03/09 02:57, 19F

03/09 02:58, , 20F
只要有用connection pool,上層取到的connection都是wrap過
03/09 02:58, 20F

03/09 02:58, , 21F
的,你close都只是把connection還回pool,不能真的關掉
03/09 02:58, 21F

03/09 03:03, , 22F
可以要求改DB定義的話去換成on commit delete吧
03/09 03:03, 22F

03/09 13:23, , 23F
你可以試著寫一個Procedure,把資料送進去後再處理
03/09 13:23, 23F

03/09 21:36, , 24F
試試用batch?
03/09 21:36, 24F

03/10 12:02, , 25F
temp table可以用stored procedure開 執行完就消失了
03/10 12:02, 25F

03/10 12:02, , 26F
不需要管連線 要做這種一堆處理的寫在裡面速度會快點
03/10 12:02, 26F
文章代碼(AID): #1Mti2M0b (java)
文章代碼(AID): #1Mti2M0b (java)