看板 java 關於我們 聯絡資訊
各位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
ssccg: temp table是在commit的時候清空,跟connection無關 03/08 20:41
ssccg: 你需要的是Transaction 03/08 20:42
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
ssccg: 忘了問哪種DB,因為你說的像oracle的所以上面是說oracle的 03/08 21:13
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
ssccg: oracle的temp table是在commit(結束transaction時清空) 03/08 21:41
ssccg: 所以就是開一個transaction中作完insert、join select 03/08 21:42
ssccg: 之後再commit 03/08 21:42
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
yyc1217: 建立connection的成本蠻大的 如果太頻繁的確會造成影響 03/08 23:04
yyc1217: 這也是為什麼有connection pool 用query清空也許比較好 03/08 23:04
yyc1217: 或是每次建立不同的temp表 db再用排程刪掉 03/08 23:06
adrianshum: Oracle temp table 建立時可指明commit 或connection 03/09 01:10
adrianshum: close 時清空。另,因為connection pool 並不會真的c 03/09 01:10
adrianshum: lose connection,類似情況下不建議用後者 03/09 01:10
ssccg: 我不知道可以設成connection close時清空,不過因為pool的 03/09 02:56
ssccg: 關係通常是用commit時清空的用法吧 03/09 02:56
ssccg: 如果是connection時清空,在用pool的情況下你只能自己每個 03/09 02:56
ssccg: transaction去做trucate了 03/09 02:57
ssccg: 只要有用connection pool,上層取到的connection都是wrap過 03/09 02:58
ssccg: 的,你close都只是把connection還回pool,不能真的關掉 03/09 02:58
ssccg: 可以要求改DB定義的話去換成on commit delete吧 03/09 03:03
cug990617: 你可以試著寫一個Procedure,把資料送進去後再處理 03/09 13:23
j16598231: 試試用batch? 03/09 21:36
kiwatami: temp table可以用stored procedure開 執行完就消失了 03/10 12:02
kiwatami: 不需要管連線 要做這種一堆處理的寫在裡面速度會快點 03/10 12:02