java程序执行一条sql语句的时候就报JDBC连接错误 启动tomcat 的时候不报错 请问有可能是哪里出问题了谢谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java程序执行一条sql语句的时候就报JDBC连接错误 启动tomcat 的时候不报错 请问有可能是哪里出问题了谢谢相关的知识,希望对你有一定的参考价值。

[http-8080-1] [2014-03-07 11:07:21.449] [INFO] - com.bjltwg.dao.impl.GetUserMenuOptionTreeDao.fetchDemoData(GetUserMenuOptionTreeDao.java:29) - 执行GetUserMenuOptionTreeDao...
[http-8080-1] [2014-03-07 11:07:21.449] [INFO] - com.bjltwg.dao.impl.GetUserMenuOptionTreeDao.fetchDemoData(GetUserMenuOptionTreeDao.java:32) - select * from TJ_STATITREE
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (validationQuery didn't return a row)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:382)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:458)
at mt.framework.core.dialect.impl.AIAble.doOpenRowSet(AIAble.java:424)
at mt.framework.core.dialect.impl.AIAble.openRowSet(AIAble.java:301)
at com.bjltwg.dao.impl.GetUserMenuOptionTreeDao.fetchDemoData(GetUserMenuOptionTreeDao.java:32)
at com.bjltwg.busi.impl.GetUserMenuOptionTreeDemo.run(GetUserMenuOptionTreeDemo.java:28)
at mt.framework.core.work.impl.XWorker.doTask(XWorker.java:33)
at mt.framework.core.work.Executor.doTask(Executor.java:36)
at mt.framework.core.dialect.impl.AIAble.run(AIAble.java:407)
at com.bjltwg.action.XAction.doAllWork(XAction.java:91)
at com.bjltwg.action.impl.GetUserMenuOptionTreeAction.demo(GetUserMenuOptionTreeAction.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)

连接池不能初始化错误

检查你的数据库连接是否正常
检查 你项目的数据库连接是否正常
检查连接参数是否正确追问

该检查的位置都已经检查了 没发现什么问题

追答

错误的信息 : 不能创建数据库连接池

validationQuery didn't return a row 检查语句没有返回任何一条记录

获取连接失败

这种错误 我以前也遇到过,启动tomcat没有一点错误信息,因为这个时候 tomcat 或者你的应用没有启动连接池

但是当你调用连接的时候,他才会去,这个时候也就报错了

当初我处理的办法就是把连接检查了一遍 发现我的数据库配置文件里面写错了

所以你的问题解决办法,应该也是同样的

追问

我想问你一下 你检查了哪些东西呀 我是直接在tomcat下面context.xml下面配置的

追答

tomcat的? 额 你可以考虑换到项目中来

楼主检查到没有.....
需要我提供 项目连接池的配置么

追问

嗯 你提供一下项目连接池配置吧 谢谢你哦

参考技术A 一定是jdbc搞错了

Java自学-JDBC 查询

在JDBC中使用ResultSet查询SQL语句

执行查询SQL语句

步骤 1 : 查询语句

executeQuery 执行SQL查询语句

注意: 在取第二列的数据的时候,用的是rs.get(2) ,而不是get(1). 这个是整个Java自带的api里唯二的地方,使用基1的,即2就代表第二个。

另一个地方是在PreparedStatement

技术图片

package jdbc;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class TestJDBC {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
 
        try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8",
                "root", "admin"); Statement s = c.createStatement();) {
 
            String sql = "select * from hero";
 
            // 执行查询语句,并把结果集返回给ResultSet
            ResultSet rs = s.executeQuery(sql);
            while (rs.next()) {
                int id = rs.getInt("id");// 可以使用字段名
                String name = rs.getString(2);// 也可以使用字段的顺序
                float hp = rs.getFloat("hp");
                int damage = rs.getInt(4);
                System.out.printf("%d	%s	%f	%d%n", id, name, hp, damage);
            }
            // 不一定要在这里关闭ReultSet,因为Statement关闭的时候,会自动关闭ResultSet
            // rs.close();
 
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

步骤 2 : SQL语句判断账号密码是否正确

  1. 创建一个用户表,有字段name,password
  2. 插入一条数据
    insert into user values(null,‘dashen‘,‘thisispassword‘);

  3. SQL语句判断账号密码是否正确

判断账号密码的正确方式是根据账号和密码到表中去找数据,如果有数据,就表明密码正确了,如果没数据,就表明密码错误。

不恰当的方式 是把uers表的数据全部查到内存中,挨个进行比较。 如果users表里有100万条数据呢? 内存都不够用的。

CREATE TABLE user (
  id int(11) AUTO_INCREMENT,
  name varchar(30) ,
  password varchar(30),
  PRIMARY KEY (id)
) ;
insert into user values(null,'dashen','thisispassword');

.

package jdbc;
   
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
   
public class TestJDBC {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
 
        try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8",
                "root", "admin");
                Statement s = c.createStatement();
                 
                ) {
            String name = "dashen";
            //正确的密码是:thisispassword
            String password = "thisispassword1";
   
            String sql = "select * from user where name = '" + name +"' and password = '" + password+"'";
              
            // 执行查询语句,并把结果集返回给ResultSet
            ResultSet rs = s.executeQuery(sql);
              
            if(rs.next())
                System.out.println("账号密码正确");
            else
                System.out.println("账号密码错误");
             
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
   
    }
}

步骤 3 : 获取总数

执行的sql语句为
select count(*) from hero

然后通过ResultSet获取出来

技术图片

package jdbc;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class TestJDBC {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
 
        try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8",
                "root", "admin"); Statement s = c.createStatement();) {
 
            String sql = "select count(*) from hero";
 
            ResultSet rs = s.executeQuery(sql);
            int total = 0;
            while (rs.next()) {
                total = rs.getInt(1);
            }
 
            System.out.println("表Hero中总共有:" + total+" 条数据");
 
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
    }
}

练习分页查询

设计一个方法,进行分页查询

public static void list(int start, int count)

start 表示开始页数,count表示一页显示的总数
list(0,5) 表示第一页,一共显示5条数据
list(10,5) 表示第三页,一共显示5条数据

答案

package jdbc;
  
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
  
public class TestJDBC {
     
    public static void list(int start, int count){
         try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
      
            try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8",
                    "root", "admin"); Statement s = c.createStatement();) {
      
                String sql = "select * from hero limit " +start + "," + count;
 
                // 执行查询语句,并把结果集返回给ResultSet
                ResultSet rs = s.executeQuery(sql);
                while (rs.next()) {
                    int id = rs.getInt("id");// 可以使用字段名
                    String name = rs.getString(2);// 也可以使用字段的顺序
                    float hp = rs.getFloat("hp");
                    int damage = rs.getInt(4);
                    System.out.printf("%d	%s	%f	%d%n", id, name, hp, damage);
                }
              
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
     
    public static void main(String[] args) {
       list(10,5);
    }
}

以上是关于java程序执行一条sql语句的时候就报JDBC连接错误 启动tomcat 的时候不报错 请问有可能是哪里出问题了谢谢的主要内容,如果未能解决你的问题,请参考以下文章

请问下在java jdbc中:sql语句中含有or 时,该如何为这个占位符(?)赋值····求解 如下图:

jdbc事务回滚

java jdbc 执行sql语句批量操作问题

Java -- JDBC 学习--通过Statement进行数据库更新操作

JavaWeb开发之JDBC知识总结

java jdbc sql语句参数的设置