
答案仅做参考,如有错误,请不要骂街
在你的连接串上加上参数useServerPrepStatements=true,例如
jdbc:mysql://localhost:3310/testuseServerPrepStatements=true&useUnicode=true
如果不行,更换一下jdbc驱动的版本,mysql的JDBC驱动5点几版本好像有这个问题。不过,我没有用过,如果可以版本3是没有这个问题的。
有可能数据在网络上已经被删掉了,这个不是太懂, 分布显示第3页的数据,代码肯定是获取了第三页的数据,页面就显示获取到的数据! 像数据库中数据删除了,更改了,这个和程序没什么关系! 就像,点第三页, 只获取,数据库中,现在 30 - 40 条内的数据!
可以以普通的jdbc连接的使用习惯来使用连接池。 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈。我们可以在互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问题:这些连接池的实现方法都不同程度地增加了与使用者之间的耦合度。很多的连接池都要求用户通过其规定的方法获取数据库的连接,这一点我们可以理解,毕竟目前所有的应用服务器取数据库连接的方式都是这种方式实现的。但是另外一个共同的问题是,它们同时不允许使用者显式的调用Connectionclose()方法,而需要用其规定的一个方法来关闭连接。这种做法有两个缺点:第一:改变了用户使用习惯,增加了用户的使用难度。首先我们来看看一个正常的数据库 *** 作过程:int executeSQL(String sql) throws SQLExceptionfinallycatch(Exception e)catch(Exception e)return res;}使用者在用完数据库连接后通常是直接调用连接的方法close来释放数据库资源,如果用我们前面提到的连接池的实现方法,那语句connclose()将被某些特定的语句所替代。第二:使连接池无法对之中的所有连接进行独占控制。由于连接池不允许用户直接调用连接的close方法,一旦使用者在使用的过程中由于习惯问题直接关闭了数据库连接,那么连接池将无法正常维护所有连接的状态,考虑连接池和应用由不同开发人员实现时这种问题更容易出现。综合上面提到的两个问题,我们来讨论一下如何解决这两个要命的问题。首先我们先设身处地的考虑一下用户是想怎么样来使用这个数据库连接池的。用户可以通过特定的方法来获取数据库的连接,同时这个连接的类型应该是标准的javasqlConnection。用户在获取到这个数据库连接后可以对这个连接进行任意的 *** 作,包括关闭连接等。通过对用户使用的描述,怎样可以接管Connectionclose方法就成了我们这篇文章的主题。为了接管数据库连接的close方法,我们应该有一种类似于钩子的机制。例如在Windows编程中我们可以利用Hook API来实现对某个Windows API的接管。在JAVA中同样也有这样一个机制。JAVA提供了一个Proxy类和一个InvocationHandler,这两个类都在javalangreflect包中。我们先来看看SUN公司提供的文档是怎么描述这两个类的。public interface InvocationHandlerInvocationHandler is the interface implemented by the invocation handler of a proxy instance Each proxy instance has an associated invocation handler When a method is invoked on a proxy instance, the method invocation is encoded and dispatched to the invoke method of its invocation handlerSUN的API文档中关于Proxy的描述很多,这里就不罗列出来。通过文档对接口InvocationHandler的描述我们可以看到当调用一个Proxy实例的方法时会触发Invocationhanlder的invoke方法。从JAVA的文档中我们也同时了解到这种动态代理机制只能接管接口的方法,而对一般的类无效,考虑到javasqlConnection本身也是一个接口由此就找到了解决如何接管close方法的出路。首先,我们先定义一个数据库连接池参数的类,定义了数据库的JDBC驱动程序类名,连接的URL以及用户名口令等等一些信息,该类是用于初始化连接池的参数,具体定义如下:public class ConnectionParam implements Serializable / 从连接池工厂中获取指定名称对应的连接池
Java程序向数据库中插入数据,代码如下:
//首先创建数据库,(access,oracle,mysql,sqlsever)其中之一,其中access,sqlsever需要配置数据源(odbc);//然后再eclipse中创建类(ConnDb,Test,TestBean)ConnDb功能为连接数据库,查询,插入,删除,修改数据的类,Test为含有main方法的测试类,TestBean为数据表中的字段属性及set,get方法
//以下是ConnDb代码:
package db;
import javasqlConnection;
import javasqlDriverManager;
import
javasqlResultSet;
import javasqlSQLException;
import
javasqlStatement;
import javautilArrayList;
public class ConnDb {
public Connection startConn(Connection conn){
try {
ClassforName("sunjdbcodbcJdbcOdbcDriver");
conn = DriverManagergetConnection("jdbc:odbc:数据库","用户名", "密码");
} catch (Exception e) {
Systemoutprintln("连接数据库时出现错误");
}
return conn;
}
public ArrayList executeQuery(String sql){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
ArrayList list = new ArrayList();
try {
conn = startConn(conn);
stmt = conncreateStatement();
rs = stmtexecuteQuery(sql);//sql为sql语句例如"select from
表名",从main方法中传进来,这里用的是ArrayList 类将查询结果存储起来
while(rsnext()){
TestBean tb = new TestBean();
tbsetTid(rsgetString("tid"));
tbsetTname(rsgetString("tname"));
tbsetTinfo(rsgetString("tinfo"));
listadd(tb);
}
}
catch (SQLException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}finally{
closeConn(rs,stmt,conn);
}
return list;
}
public void executeUpdate(String sql){
Connection conn = null;
Statement stmt = null;
try {
conn =
startConn(conn);
stmt = conncreateStatement();
stmtexecuteUpdate(sql);
}
catch (SQLException e) {
Systemoutprintln("修改,插入或者删除数据库数据时发生错误!");
}finally{
closeConn(stmt,conn);
}
}
public void closeConn(ResultSet rs,Statement stmt,Connection conn){
try {
if(rs !=
null){
rsclose();
}
if(stmt != null){
stmtclose();
}
if(conn != null){
connclose();
}
}
catch (SQLException e) {
// TODO Auto-generated catch
block
Systemoutprintln("关闭数据库的时候发生错误!");
}
}
public void closeConn(Statement stmt,Connection conn){
try {
if(stmt != null){
stmtclose();
}
if(conn != null){
connclose();
}
}
catch (SQLException e) {
// TODO Auto-generated catch block
Systemoutprintln("关闭数据库的时候发生错误!");
}
}
}
createStatement 这个不是报错,只是这句可能会抛出异常,这种情况在java中是必须使用 try catch 捕捉的。 你只要把代码块用 try catch 包起来就可以了。
Java连接数据库一般都是六步(具体的 *** 作步骤会不同):
连接数据库之前要导入数据库相应的驱动包。
以MySQL数据库为例:
1加载数据库驱动
try {
ClassforName("commysqljdbcDriver");
} catch (Exception e) {
eprintStackTrace();//打印异常
}
2连接数据库
try{
conn=DriverManagergetConnection("jdbc:mysql://localhost:3306/db",
"root","root");//获得数据库连接,用户名,密码,db:数据库名称
}catch(Exception e){
eprintStackTrace();
}
3创建执行语句
Statement stmt=conncreateStatement();
4返回结果。
ResultSet rs=stmtcreateStatement("select from dbtable");
5处理结果
while(rsnext()) {
rsgetString("username");
rsgetString("password");
}
6关闭所有连接(先打开的连接后关闭)]
rsclose();
stmtclose();
connclose();
以上就是关于java 数据库的问题全部的内容,包括:java 数据库的问题、java关于数据库查询的一个问题,怎样查询的数据不会失去时效性,而且还保持更新、Java中对数据库 *** 作实例等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)