
java
对读取数据库的数据可以显示在网页上,可以对数据进行分类,保存到其它数据库或者是文件里等,当然前提就是要把数据读取出来
以读取数据为例:
解析:
上面代码就是首先注册驱动,然后进行连接
如果连接成功
就可以用select语句进行执行并读取了
不建议这样做,一般不符合开发规范,如果这样的话,你想想在业务量多的情况下,多个线程如果不控制,数据库连接会将数据库服务器爆掉的,会影响业务的
常规做法:数据库连接池(durid了解一下),据某些统计哈,真正用来做查询的资源不超过整个查询数据库的生命周期的30%,大部分时间都用开创建连接关闭连接等 *** 作,如果这个时候建立数据库连接池的话,可以有效的将这部分时间释放掉
同步就是许多线程同时用一个资源啥的哦,一个在用别的就要等,异步就相反了,可以不用等待
下面这是人家的话:
同步:发送一个请求,等待返回,然后再发送下一个请求
异步:发送一个请求,不等待返回,随时可以再发送下一个请求
同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。
异步则是可以提高效率了,现在cpu都是双核,四核,异步处理的话可以同时做多项工作,当然必须保证是可以并发处理的。
这些都是对的。
同步和异步最大的区别就在于。一个需要等待,一个不需要等待。
比如广播,就是一个异步例子。发起者不关心接收者的状态。不需要等待接收者的返回信息
电话,就是一个同步例子。发起者需要等待接收者,接通电话后,通信才开始。需要等待接收者的返回信息
深圳远标帮助您:
Java可以使用JDBC对数据库进行读写。JDBC访问一般分为如下流程:
1、加载JDBC驱动程序:
在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),
这通过javalangClass类的静态方法forName(String className)实现。
例如:
try{
//加载MySql的驱动类
ClassforName("commysqljdbcDriver") ;
}catch(ClassNotFoundException e){
Systemoutprintln("找不到驱动程序类 ,加载驱动失败!");
eprintStackTrace() ;
}
成功加载后,会将Driver类的实例注册到DriverManager类中。
2、提供JDBC连接的URL
连接URL定义了连接数据库时的协议、子协议、数据源标识。
书写形式:协议:子协议:数据源标识
协议:在JDBC中总是以jdbc开始
子协议:是桥连接的驱动程序或是数据库管理系统名称。
数据源标识:标记找到数据库来源的地址与连接端口。
例如:(MySql的连接URL)
jdbc:mysql://localhost:3306/testuseUnicode=true&characterEncoding=gbk ;
useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为
gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。
3、创建数据库的连接
要连接数据库,需要向javasqlDriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。
使用DriverManager的getConnectin(String url,String username,String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。
例如:
//连接MySql数据库,用户名和密码都是root
String url = "jdbc:mysql://localhost:3306/test" ;
String username = "root" ;
String password = "root" ;
try{
Connection con =
DriverManagergetConnection(url , username , password ) ;
}catch(SQLException se){
Systemoutprintln("数据库连接失败!");
seprintStackTrace() ;
}
4、创建一个Statement
要执行SQL语句,必须获得javasqlStatement实例,Statement实例分为以下3种类型:
1、执行静态SQL语句。通常通过Statement实例实现。
2、执行动态SQL语句。通常通过PreparedStatement实例实现。
3、执行数据库存储过程。通常通过CallableStatement实例实现。
具体的实现方式:
Statement stmt = concreateStatement() ;
PreparedStatement pstmt = conprepareStatement(sql) ;
CallableStatement cstmt = conprepareCall("{CALL demoSp( , )}") ;
5、执行SQL语句
Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate和execute
1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。
2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等
3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。
具体实现的代码:
ResultSet rs = stmtexecuteQuery("SELECT FROM ") ;
int rows = stmtexecuteUpdate("INSERT INTO ") ;
boolean flag = stmtexecute(String sql) ;
6、处理结果
两种情况:
1、执行更新返回的是本次 *** 作影响到的记录数。
2、执行查询返回的结果是一个ResultSet对象。
ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些行中数据的访问。
使用结果集(ResultSet)对象的访问方法获取数据:
while(rsnext()){
String name = rsgetString("name") ;
String pass = rsgetString(1); // 此方法比较高效(列是从左到右编号的,并且从列1开始)
}
7、关闭JDBC对象
*** 作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:
1、关闭记录集
2、关闭声明
3、关闭连接对象
if(rs != null){ // 关闭记录集
try{
rsclose() ;
}catch(SQLException e){
eprintStackTrace() ;
}
}
if(stmt != null){ // 关闭声明
try{
stmtclose() ;
}catch(SQLException e){
eprintStackTrace() ;
}
}
if(conn != null){ // 关闭连接对象
try{
connclose() ;
}catch(SQLException e){
eprintStackTrace() ;
}
}
现在sun下一个jdbc-odbc驱动
然后建一个数据源
//sql为查询语句
import javasqlStatement;
import javasqlConnection;
import javasqlDriverManager;
conStr="jdbc:odbc:[数据源名]"
Connection conn = DriverManagergetConnection(conStr);
Statement state = (Statement) conncreateStatement();
Result result=stateexecute(sql);
connclose();
软件模块之间的调用关系可以分为两大类:即同步调用和异步调用。在同步调用中,一段代码(主调方)调用另一段代码(被调方),主调方必须等待这段代码执行完成返回结果后,才能继续往下执行,所以,同步调用是一种阻塞式调用,主调方代码一直阻塞等待直到被调方返回为止。同步调用相对比较直观,也是大部分编程语言直接支持的一种调用方式。但是,同步调用在处理比较耗时的情况下会严重影响程序性能,影响人机交互的瞬时反应。例如,某个程序需要访问数据库获取大量数据,然后根据这些数据进行一系列处理,将处理结果显示在程序主窗口。由于数据库访问和大量数据的处理都是耗时的工作,在这个工作完成之前,处理结果迟迟不能显示,用户点击鼠标也不会立即得到响应,让用户感到整个程序显得很沉重。面对这样一些需要比较长时间才能完成的应用场景,我们需要采用一种非阻塞式调用方式,即异步调用方式。在异步调用中,主调方调用被调方后,不等待对方返回结果就继续执行后续代码,被调方执行完毕后,通过某种手段通知调用方:结果已经出来,请酌情处理。我们可以对上面的例子改用异步调用将问题轻松化解:把整个耗时的工作放进一个单独的线程,由主调方启动此线程后继续执行后续代码,线程在背后悄悄地处理费时的工作,当工作完成,采用回调的方式通知主调方工作完成,主调方将结果显示在主窗口。经过这样的处理,主界面继续进行自己的工作而不必死等,就不会造成界面响应迟钝。
在实现异步调用机制时,除了线程之外,还要用到回调。回调是一种双向调用,也就是,被调方在被调用时也会调用主调方的代码。在异步调用中,被调方需要在工作完成时通知主调方,即调用主调方的接口,这一机制通过回调实现。回调和异步调用的关系非常紧密,回调是异步调用的基础[1]。
本文理论联系实际,首先阐述如何使用Java实现回调机制,然后进一步阐述使用Java回调和线程实现异步调用,最后,阐述在异步调用中如何处理超时问题。
1 Java回调机制的实现方法
实现Java回调,需要做如下三件事情:
(1)定义一个回调接口CallbackInterface
接口中声明回调方法handle,如图1所示,回调方法就是一个普通的方法,接收一个消息字符串或者一个封装了数据的事件。
(2)定义一个类实现回调接口
这个类其实就是消息接收者和处理者,也就是调用方,回调方法是消息发生时实际处理消息的方法,此处简化为一条打印语句。
(3)定义消息通知者
消息通知者也就是被调用方必须具备两种能力,第一,它必须知道谁是消息接收者,第二,当消息发生时,它能够回调这些接收者的回调方法。为了获得这两种能力,消息通知者首先必须提供一个注册方法register, 通过注册的方式来注册多个对此消息或事件感兴趣的对象。然后提供一个消息通知方法notifyMessage,在这个方法中调用所有消息接收者的回调方法。具体代码如图3所示。
比如用一个可变数组List用于保存消息接收者,注册的过程实际上是将消息接收者添加到这个数组,以备在需要通知消息的时候调用这些消息接收者的回调方法。
使用Java回调和线程实现异步调用
线程是一个独立的执行流,其本质是程序中一段并发执行的代码。在异步调用机制中引入线程,在线程中完成耗时的工作,其目的是让调用方的主线程继续执行后续代码而不需要等待被调方的结果返回。由于不需要等待,这样我们就等于同时做了两件事情,而这两件事情分别是在不同的执行流中执行,主调者在当前的主线程中执行,被调者在另外一个线程中执行,因此提高了程序的效率,避免了界面的响应迟钝。当被调者执行完成后,仍然采用回调通知主调者。
例如 LongTimeWorker是一个用于完成耗时工作的线程,同时又是消息通知者。其耗时工作在run方法中完成,另外提供一个注册方法register, 和一个消息通知方法notifyMessage,在run方法的最后,即耗时工作完成以后,调用notifyMessage将消息广播出去。
3 异步调用中超时问题的处理
异步调用通常都要加入超时机制,因为我们总是希望在一个指定的时间范围内返回一个结果,即使没有得到结果也该有个超时通知。这时我们需要使用“限时线程回调方式”,它在原有线程回调的基础上加上一个计时器Timer以计算消耗的时间,如果时间期限到了任务还没有执行完成即中断线程,并将超时消息广播出去。LongTimeWorker类需要修改部分的代码如图8和图9所示。
首先LongTimeWorker线程类增加了一个构造方法,其参数是超时时间timeout,构造方法的主要任务是创建一个定时器,每秒钟计时一次,若超时时间到则终止本线程,并广播超时消息。LongTimeWorker线程类的第二个改变发生在其run方法中,线程一启动立即开始计时,完成工作后停止计时,并广播消息。
4 结束语
异步调用是一种非阻塞式调用方式,用于在处理比较耗时的任务时保证程序性能不受到影响。实现异步调用的关键在于要解决三个技术难题,它们分别是程序阻塞问题、异步消息的传递问题和超时问题。本文介绍的方法采用并发线程、回调机制和计时器使上述问题得到了圆满解决。
本文对编写客户服务器应用的java程序员有所帮助 可以解决程序在对方出现故障的时候继续稳定运行 目前java平台已经广泛应用于各类客户/服务器系统中 在实际编程中 往往需要网络的异步处理 比如客户程序 如果客户程序运行先于服务程序 则客户程序则需要在服务程序启动后再自动连接服务程序 在客户程序运行中如果服务程序中途停止 则也需要在不停止的条件下 等待服务程序运行并重新连接 下面提供了一类异步编程的方法
网络异步应用涉及到如下几个关键点
◇ 客户应用启动后 检测服务应用是否存在 如果不存在 则等待服务应用启动 同时不堵塞客户应用其他任务的执行 一旦服务应用启动 客户应用应该及时的与其建立连接 ◇ 客户应用和服务应用在数据通信中 服务应用异常退出后 客户应用应可以检测到服务应用的退出 同时客户应用自动清除该通信链路 回到初始状态 等待服务应用重新启动
该网络异步编程首先涉及到一个定时器和定时器事件 该定时器用于不断的检测网络中客户应用和服务应用是否连通 同时在服务应用出现异常时中止数据通信 返回到初始状态 网络的故障可以通过网络方法的异常处理获知
定时器包含在网络通信类中 使得使用该类的应用感知不到定时器的存在 而方便的处理网络信息
客户程序类如下结构 public class NetComm implements ActionListener{ javax swing Timer timer = new javax swing Timer( this); Socket sock;private EventNotifier en;public static int net_state = ;InetAddress ServerAddr;int ServerPort; public NetComm(InetAddress addr int port){ ServerAddr = addr; ServerPort = port;}
public void NetComm_Init() { net_state = ; try { sock = new Socket(ServerAddr ServerPort); } catch (IOException e) { net_state = ; } timer start();} public void NetComm_Data(){ try { OutputStream outputstream = sock getOutputStream(); BufferedWriter out = new BufferedWriter (new OutputStreamWriter(outputstream)); out write( java by ghf@china ); out flush();
BufferedReader in = new BufferedReader (new InputStreamReader(sock getInputStream())); boolean more = true; while(more) { String str = in readLine(); if(str == null) more = false; else // 处理数据 System out println(str); } in close();
} catch (IOException e) { NetComm_Close(); net_state = ; } timer start(); } public void NetComm_Close() { if(sock != null) try{ sock close(); } catch ( IOException e) { } } public void actionPerformed(ActionEvent e) { if(net_state == ) NetComm_Init(); else NetComm_Data(); }}
在以上程序中 也可以为外部应用提供一个回调函数 以便在网络异常或恢复正常时通知应用 服务应用的网络通信类类似 可以放在同一类中
lishixinzhi/Article/program/Java/hx/201311/27252
以上就是关于java 对读取数据库的数据 怎么处理全部的内容,包括:java 对读取数据库的数据 怎么处理、java线程中使用mysql连接查询数据库、java 中同步和异步的原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)