jdbc代理
⑴ JDBC鏈接資料庫的方法有幾種各自的優缺點
它代表最低級別的持久性策略。本地框架各不相同,但大多數有著相似的特徵。 大多數 JDBC 解決方案把所有的數據訪問包裝在數據訪問對象中,對象中包裝有一個關系表。從那裡,您可以把數據留在結果集或者選擇把結果集中的每一行映射到一個對象。Java 技術開發人員傾向於映射到輕值對象(light value objects)。一個特殊的替代方案是 Martin Fowler 的有效記錄設計模式,這種設計模式提供針對數據表中行的包裝程序。每一個有效記錄都有訪問每一列的方法,以及保存、刪除或更新行的方法。 長處 基於JDBC 的解決方案提供良好的控制能力。您要寫更多的代碼來解決預料中的問題,但是您有訪問資料庫的所有權利,並且可以讓它只做您想要它做的事。純 JDBC 給予您非常好的靈活性。 弱點 關系資料庫和對象並不是一回事 —— 這里有一點分歧。您不得不處理一些面向對象的概念,如繼承。您還必須自己管理每一個對象,寫查詢程序來完成創建、讀取、更新或刪除操作。如果要提升性能,需要提供您自己的緩存。 總結 對於那些技術不好但了解 SQL 的 Java 程序員來說,JDBC 是一個很好的選擇。如果您需要更好的訪問 SQL 或者在進行批處理計算或報告,那麼 JDBC 也能勝任。 變種 有幾個框架和工具可以幫助您擴展 JDBC。一些工具,像 Velocity 和 MiddleGen,會生成數據訪問對象,給出資料庫表的描述。Spring 提供依賴注入和面向方面的編程,這使得服務和依賴關系的集成更加容易。但是總得來說,應用程序結構和策略應該保持一致。 對象關系映射程序 OOP 和關系資料庫基於根本不同的基礎。通常,很難把兩者混合起來。如果您有一個現有的關系模式或一個可能頻繁改變的關系模式,那麼 ORM 框架也許正是您需要的。大多數的 ORM 試圖讓您透明地處理對象。您提供一個 POJO,然後,通過使用代碼生成(EJB)、位元組碼操縱(JDO)或反射(Hibernate),框架與持久性相關聯。每種技術都有它的長處和弱點,因此大多數的框架使用多種方法來完成工作。 您需要告訴應用程序如何映射資料庫表到應用程序的類。您可以用一個獨立的 XML 文件或程序代碼中的注釋來達到目的。這些注釋可以採取 Java 5 注釋的形式(使用 XDoclet 之類的工具)。如果模式和對象模型不會走到一起,我一般會將代碼和配置文件分離。 持久性框架讓您從資料庫載入一系列的對象。您可以顯示它們,或操縱它們並把它們存回到關系資料庫。大多數的 ORM 框架提供擴展,比如兩級緩存。一般來說,第一級緩存保證事務的完整性,第二級保證跨集群中機器的一致性。盡管有多種實現,但是您應該准確理解緩存策略。 您需要用於管理配置和依賴性的策略。您的應用程序可能需要選擇一個事務策略並使用數據源和連接池。正如在前面的章節中所學到的那樣,Spring 和 ORM 能很好地為您處理這些問題。這里有一些可用的 ORM。 EJB 企業級 JavaBean 提供兩種標准化的持久性策略,EJB 1.x 標准 和 2.x 標准。第二個標准做的更好,但仍然過於復雜。EJB 專家組承認這一事實並將提供第三個標准,即 EJB 3 JSR;但是該標准將對所有的 Java Enterprise Edition (JEE) 用戶可用,不僅僅是對 EJB 用戶可用。因此,EJB 持久性標准實際上是一條死路,因為新的應用程序想要目標方案接近期望的 JSR 220 標准。 Hibernate Hibernate 很快變成了持久性的事實上的標准。它快速,有效,而且是免費的。因為 Hibernate 讓您制定任意的 POJO 持久性,所以它必須有一種方法把持久性關聯到一個對象而不必改動代碼。Hibernate 主要通過反射來提供透明性,但是它通過動態代理混合在一些運行時位元組碼操縱中。使用反射,Hibernate 可以在事務完成前後查看對象的狀態。如果狀態發生改變,Hibernate 可以把它保存到資料庫中。代理幫助 Hibernate 實現一些其他的特性,比如懶散載入(lazy loading)。(把動態代理想像成一個坐在目標對象前面的對象,它有一個與目標對象相同的介面。每當您調用某些方法或訪問實例變數時,代理都可以自由地調用持久層。) Hibernate 僅支持關系資料庫,而且它與 SQL 結合的緊密程度比大多數其他的持久性框架要高。Hibernate 使用類似於 SQL 的查詢語言,這種相似性對用戶的幫助很大。如果需要,您也可以在 Hibernate 中直接使用 SQL。 像JDO 一樣,Hibernate 擁有兩級緩存。第一級緩存叫做會話,給您一個存放持久性對象的地方。您可以把對象載入緩存並操縱它們。然後決定何時通過在會話上調用刷新(flush)或提交(commit)來將更改持久存儲到資料庫中。 Hibernate 幫助您管理關系。如果您定義一個關系,比如雇員屬於部門,Hibernate 將對其進行管理。如果您載入一個部門的信息,您可以決定是在載入一個部門時載入所有的雇員信息(熱切載入),還是等待載入雇員信息(懶散載入)。 長處 Hibernate 有一個靈活的映射機制。一些場景比其他場景付出更多的努力來映射,但是如果您能在一個關系模式中表示它,那麼也許在 Hibernate 中有一種方法來映射到它。Hibernate 的性能比大多數的框架要好而且還在不斷提升。文檔很優秀,收購 JBoss 後,支持也在改善。JBoss 小組也把 Hibernate 放置在一個合適的位置以搶在競爭者之前實現 JSR 200 持久性標准。 對Hibernate 來說,與其他開放源碼框架和商業框架的集成比其他的替代框架要好。一般來說,Spring 與 Hibernate 的集成比與其他任何一個持久性框架的集成要好。 Hibernate 是一個創新的框架。在推動與 SQL 的集成上,它比大多數其他的框架走的更遠。它具有一些其他框架不支持的特性,比如會話過濾。還有一支強大的公共和商業開發人員團隊為其工作。 弱點 如果您是一家大公司,那麼您可能要用不支付許可費來彌補支持上的欠缺。Hibernate 比替代框架更加難以管理。例如,您沒有 SolarMetric 的 Kodo JDO 產品提供的豐富的管理控制台。您也沒有 Versant 的 JDP 產品提供的豐富的用戶界面工具。 最後,Hibernate 不像一些持久性框架那麼專業。例如,對於一些邊緣情況,比如管理懶散載入,Kodo JDO 有非常好的錯誤信息和更加可預測的行為。 JDO 如果您想要帶持久性框架的 Betamax,JDO 1.x 就足夠了 —— 雖然時運似乎在轉向 JDO 2,更不用說 JSR 220 持久性標准了。在過去三年左右的時間里,最好的技術持久性框架來自 JDO 社區。JDO 通過位元組碼增強機制實現了透明性。JDO 2 多少會放鬆這個限制。 JDO 提供一種叫做 JDO QL 的查詢語言。對緩存和提取定義了懶散/熱切提取場景的組(可以在每次查詢的基礎上定義這樣的場景),它有正式的性能擴展。JDO 還為分離式處理(detached processing)提供一個模型,以便您能夠從一個 JDO 會話(叫做 PersistenceManager)分離一個對象,改變並重新附加該對象。然後資料庫應用所有更改。 JDO 還為任意的數據存儲提供透明的持久性。在現實世界中,大多數的數據是非關系型的,JDO 自己就能很好地為該社區提供解決方案。 長處 JDO 的各種供應商各有長處。Kodo 產品在需要極限持久性場景的利基市場賣得很好。Kodo 執行快速,並得到廣泛的認同:它對任何一個 JDO 產品都有最好的映射支持。(我要說,就現在來看,它的映射支持是業界最好的。)Kodo 還在可管理性方面領先。(Versant 產品也有著非常快的速度。)顯然,它的最大優點是針對映射支持的用戶界面。 弱點 對JDO 弱點的任何處理都必須從市場份額開始。作為一個標准,JDO 應當得到更好的保護,但是到目前為止,這個標准並不是非常成功。具有諷刺意味的是,JSR 220 持久性標準的出現很可能會對 JDO 造成打擊。許多 JDO 供應商已經宣布在他們的產品中支持 JSR 220。您將會看到一個更強大的標准,而且好的 JDO 供應商將能夠在那些市場中佔有一席之地。JSR 220 標准將會開放,而且新的標准將從那裡快速產生,您將會看到顧客使用同樣的標准來嘗試 JDO。由於疲弱的市場表現, JDO 需要在開放源碼社區中更好地表現。Versant 向 Eclipse 小組捐贈它的產品是在正確的方向上前進了一步。 其他 Top Link、OJB 和 Cayenne 正在追趕 Hibernate,但是它們不可能趕上了(出於許多因素)。在接下來的幾期文章中,我將用其他的語言如 Ruby 或 Python 來探索幾個框架。 混合解決方案 本文將在介紹完一種混合解決方案後結束。大多數的 ORM 解決方案把一個類映射到一個關系資料庫模式,而諸如 iBATIS 之類的混合框架則把類映射到一個 SQL 查詢的結果。 對於iBATIS,您提供一個 XML 文件,它指定查詢和從那些查詢到對象的映射。您能得到 ORM 的一些好處,比如一致緩存策略、獨立於代碼庫的 SQL 和限定的關系管理。 長處 iBATIS 還有一些 ORM 框架沒有的優點。您有對 SQL 的嚴格控制的權利,不必擔心對象/關系的不匹配,也不必投入幾個月來學習一個對象/關系映射框架。 弱點 iBATIS 不會給予您 ORM 所做的一切。您需要編碼查詢來完成每一次的資料庫訪問,而不是您自己來完成訪問。與資料庫的結合更加緊密。並依靠您選擇的 SQL 方言。
⑵ jdbc如何通過代理伺服器訪問資料庫
B伺服器部署抄數據訪問層的程序,襲可以用Web Service或可以用JNDI訪問到的組件如EJB等
C伺服器上面的程序調用Web Service發布的功能,或通過JNDI訪問EJB上的Remote介面來獲取數據
⑶ java中的代理類一般在什麼時候使用呢
1.代理模式
代理模式的作用是:為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個客戶不想或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
代理模式一般涉及到的角色有:
抽象角色 :聲明真實對象和代理對象的共同介面;
代理角色 :代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的介面以便在任何時刻都能代替真實對象。同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當於對真實對象進行封裝。
真實角色 :代理角色所代表的真實對象,是我們最終要引用的對象。
代理模式使用原因和應用方面
(1)授權機制 不同級別的用戶對同一對象擁有不同的訪問權利,如Jive論壇系統中,就使用Proxy進行授權機制控制,訪問論壇有兩種人:注冊用戶和遊客(未注冊用戶),Jive中就通過類似ForumProxy這樣的代理來控制這兩種用戶對論壇的訪問許可權.
(2)某個客戶端不能直接操作到某個對象,但又必須和那個對象有所互動.
舉例兩個具體情況:
如果那個對象是一個是很大的圖片,需要花費很長時間才能顯示出來,那麼當這個圖片包含在文檔中時,使用編輯器或瀏覽器打開這個文檔,打開文檔必須很迅速,不能等待大圖片處理完成,這時需要做個圖片Proxy來代替真正的圖片.
如果那個對象在Internet的某個遠端伺服器上,直接操作這個對象因為網路速度原因可能比較慢,那我們可以先用Proxy來代替那個對象.
總之原則是,對於開銷很大的對象,只有在使用它時才創建,這個原則可以為我們節省很多寶貴的Java內存. 所以,有些人認為Java耗費資源內存,我以為這和程序編制思路也有一定的關系.
(3)現實中,Proxy應用范圍很廣,現在流行的分布計算方式RMI和Corba等都是Proxy模式的應用
⑷ java連接mysql 代理
System.out.println("conn="+conn);
列印出的結果是 null?
⑸ 用java的動態代理模式寫jdbc 求代碼 謝謝
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection {
private final String DRIVER="com.mysql.jdbc.Driver";//mysql資料庫驅動
private final String URL="jdbc:mysql://localhost:3306/test";//url
private final String USERNAME="root";//用戶名
private final String PASSWORD="root";
Connection conn=null;//定義對象
public DBConnection(){//初始化
try{
Class.forName(DRIVER);
conn =DriverManager.getConnection(URL,USERNAME,PASSWORD);//
System.out.println("連接成功!");
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
catch(SQLException e){
e.printStackTrace();
}
}
public Connection getConnection(){
return this.conn;
}
public void distory(){//用完資料庫關閉
try{
conn.close();
}
catch (SQLException e){
e.printStackTrace();
}
}
}
用的時候直接調用conn這個變數就可以了!!!!
⑹ 利用AOP如何實現JDBC 中的事務管理
========== aop代理 j2se中
//實現類
public class Computer implements PCIntef
{
public void buy()
{
System.out.println("aaaa");
}
}
//介面類
public interface PCIntef
{
public void buy();
}
//綁定 類
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Daili implements InvocationHandler
{
private Object delegate;
public Object bind(Object delegate)
{
this.delegate=delegate;
return Proxy.newProxyInstance(
delegate.getClass().getClassLoader(),
delegate.getClass().getInterfaces(),
this);
}
public Object invoke(Object arg0,Method arg1,Object[] arg2)throws Throwable
{
//執行代理 代碼
System.out.println("a");
Object result=arg1.invoke(delegate,arg2);
return result;
}
}
主函數中:
Daili daili=new Daili();
//綁定 相應的類
PCIntef pci=(PCIntef)daili.bind(new Computer());
//調用 方法時 就會執行 代理 執行的東西
pci.buy();
//這些 希望你能 明白 怎麼回事!!
//還有 執行前的 轉載 類 和 執行 後的 你可以去 網上找找 相關 代碼!!
⑺ 如何在Java代理中使用JDBC的連接池
/**
13 * 使用代理創建連接池
14 * @author ASUS
15 *
16 */
17 public class ProxyConnUtils {
18
19 private static LinkedList<Connection> pool = new LinkedList<>();
20 private static String url;
21 private static String user;
22 private static String password;
23 private static String driverClass;
24 //private static Connection conn;
25 static{
26 try {
27 Properties properties = new Properties();
28 InputStream in = ProxyConnUtils.class.getResourceAsStream("/db.properties");
29 properties.load(in);
30 url = properties.getProperty("url");
31 System.err.println(url);
32 user = properties.getProperty("user");
33 password = properties.getProperty("password");
34 driverClass = properties.getProperty("driverClass");
35 Class.forName(driverClass);
36 for(int i = 0;i<3;i++){
37 final Connection conn = DriverManager.getConnection(url, user, password);
38 //對connection做代理
39 Object connProxy = Proxy.newProxyInstance(ProxyConnUtils.class.getClassLoader(),
40 new Class[]{Connection.class},
41 new InvocationHandler() {
42
43 @Override
44 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
45 //判斷是否是close方法 回收連接
46 if(method.getName().equals("close")){
47 synchronized (pool) {
48 System.err.println("不能關閉");
49 pool.addLast((Connection) proxy);
50 pool.notify();
51 return null;
52 }
53 }else{
54 //若果調用的不是close方法 直接放行
55 return method.invoke(conn, args);
56 }
57 }
58 });
59 // 將代理對象添加到池中去
60 pool.add((Connection) connProxy);
61 }
62 } catch (Exception e) {
63 e.printStackTrace();
64 throw new RuntimeException(e);
65 }
66 }
67
68 //獲取connection連接
69 public static Connection getConnection(){
70 synchronized (pool) {
71 if(pool.size() == 0){
72 try {
73 pool.wait();
74 } catch (Exception e) {
75 e.printStackTrace();
76 throw new RuntimeException(e);
77 }
78 }
79 Connection connection = pool.removeFirst();
80 return connection;
81 }
82 }
83 }
⑻ 身份驗證系統,java開發3個程序,分別是client、ProxyServer、DBServer
1.嚴格的標准化設計
系統設計符合相關國際通用標准,證書格式採用X509 V3標准,證書注銷列表採用X509 V2標准。系統內部使用的密碼設備介面為PKCS#11介面和MS CSP介面,支持多種型號的硬體密碼設備。
2.靈活的模塊化設計
以結構化、模塊化為設計原則,組成系統的不同模塊之間相對獨立,可以根據不同用戶的需求實現靈活搭配,具有良好的可擴展性。
3.完善的安全措施
採取通信加密、安全通信協議等安全措施進行安全防護。利用硬體加密設備對網路傳輸數據進行加密,使得通信數據以密文的方式在網路上進行傳輸,同時採取硬體密碼設備、密鑰管理安全協議、密鑰存儲訪問控制、密鑰管理安全審計等多種措施對密鑰安全進行安全防護,系統用戶使用數字證書進行身份認證,確保系統自身安全。
系統內採用的安全硬體產品均通過國家密碼局的安全鑒定,證書和密鑰存儲在USBKEY中,安全可靠。
4.有效的防護機制
在設計上包括安全防護機制、安全檢測機制和安全恢復機制。對於重要的系統數據和物理設備進行安全備份和安全管理,確保系統運行可靠。
5.簡單的部署使用
管理系統採用B/S結構,管理員通過瀏覽器對系統進行操作,無需安裝客戶端軟體,操作簡單方便。
6與第三方CA相比其優勢
1)可實現對內部信息系統在應用層面的安全要求,實現內部數字證書的發放及管理。
2)一次投資即可實現長期使用,無證書年檢等費用支出。
3)所發放的數字證書可應用於企業內部的多個系統中,實現真正的"一證多應用"。
4)系統部署可配置,可選擇使用軟加密庫作為企業級CA系統的根密鑰存儲設備,從而降低成本。
⑼ 怎樣讓使用代理伺服器來訪問MYSQL網路資料庫
i think this should look like..
applet
jdbc-> lokal server someport
lokal sever someport
get data_for_sqlserver
embed data_for_sqlserver -> post_http_data_for_sqlserver
socket port 80-> http://yourwebserver/servlet
send post_http_data_for_sqlserver (use POST)
is this ok for u ?
remote server with servlet
getPost post_http_data_for_sqlserver
unwrap post_http_data_for_sqlserver -> data_for_sqlserver
socket-> mysql on right port
send data_for_sqlserver
receive data_from_sqlserver
embed data_from_sqlserver -> http_response_data_from_sqlserver
sendResponse http_response_data_from_sqlserver
lokal server someport
receive http_response_data_from_sqlserver
unwrap http_response_data_from_sqlserver -> data_from_sqlserver
send data_from_sqlserver
applet
jdbc.get data_from_sqlserver -> ResultSet
as you can see this is a lot of work and im not sure if you can open a
serverport in untrusted applets.
so if you can connect to port 80 without a runing webserver you can
write your own jdbc-redirect-proxy
applet
jdbc-> your jdbcproxy on port 80
jdbcproxy
get data_to_sqlserver
socket-> mysql on right port
send data_to_sqlserver
get response -> data_from_sqlserver
send data_from_sqlserver
applet
jdbc.get data_from_sqlserver -> ResultSet
⑽ oracle.jdbc.proxy.annotation.post怎麼用
#include <stdio.h>
/* input to output; 2nd version */
main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}