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);
}