• [赋能学习] Tableau对接HetuEngine指导(更新)
    说明:windows环境安装Tableau,通过ODBC接口对接HetuEngine前置条件:FusionInsight HD 集群安装完毕,集群状态健康已安装HetuEngine服务windows环境已安装Tableau一.目前支持的对接方法Keytab方式用户名/密码ODBC转JDBC方式对接Hetu支持支持JDBC方式对接Hetu待支持待支持二.  安装河图ODBC驱动ODBC驱动下载地址:https://openlookeng.io/download.html ,下载后获取文件 hetu-odbc-win64.msi下载完成后,双击安装,选默认配置即可,一直next,直到finish。三.配置数据源驱动3.1 停止自动启动的odbc服务a.         通过cmd命令行进入“C:\Program Files\openLooKeng\openLooKeng ODBC Driver 64-bit\odbc_gateway\mycat\bin ”目录cd C:\Program Files\openLooKeng\openLooKeng ODBC Driver 64-bit\odbc_gateway\mycat\binb.         执行启动停止自动启动命令mycat.bat stop3.2 获取HetuEngine的JDBC驱动包 获取jdbc驱动包有多种方式,可从如下方式中任意选一个,获取到的jdbc驱动包为 presto-jdbc-*.jar,其中*因版本信息不同可能有所不同方式一:Manager页面获取a.       登录FusionInsight Managerb.       选择“集群 -> 服务 -> HetuEngine > 概览”c.       在页面右上角,选择“更多 > 下载客户端”,根据界面提示下载“完整客户端”文件到本地d.       解压HetuEngine客户端压缩包文件“FusionInsight_Cluster_1_HetuEngine_Client.tar”获取jdbc文件, jdbc文件路径:FusionInsight_Cluster_集群ID_HetuEngine_Client.tar/FusionInsight_Cluster_集群ID_HetuEngine_ClientConfig.tar/FusionInsight_Cluster_集群ID_HetuEngine_ClientConfig/HetuEngine/presto-jdbc-316-hw-ei-*.jar方式二:maven仓库获取获取链接: https://repo.huaweicloud.com/repository/maven/huaweicloudsdk/io/prestosql/presto-jdbc/316-hw-ei-302002/方式三:在HetuEngine客户端获取假设客户端安装在/opt/client目录,那么获取驱动路径为 /opt/client/HetuEngine/hetuserver/bin3.3 将JDBC驱动包拷贝到ODBC中 拷贝上一步获取的jdbc文件到C:\Program Files\openLooKeng\openLooKeng ODBC Driver 64-bit\odbc_gateway\mycat\lib目录下,并删除该目录下的hetu-jdbc-1.0.1.jar包四. 其他安全配置4.1 获取相关文件步骤1 下载HetuEngine用户的Kerberos认证文件。1.       登录FusionInsight Manager。2.       选择“系统 > 权限 > 用户”。选择对应的HetuEngine用户,在“操作”列中选择“更多 > 下载认证凭据”。3.       从下载的文件中解压后获取“user.keytab”和“krb5.conf”文件。    步骤2 使用WinSCP工具以omm用户登录FusionInsight Hetu集群中部署了HSBroker角色的节点,进入“${BIGDATA_HOME}/FusionInsight_Hetu_8.0.2.1/xxx_HSBroker/etc/”目录,下载“jaas-zk.conf”和“hetuserver.jks”文件到本地。步骤 3 参考如下修改“jaas-zk.conf”文件,“keyTab”为访问HetuEngine用户的keytab文件路径。Client   {com.sun.security.auth.module.Krb5LoginModule   requireduseKeyTab=truekeyTab="C:/hetu/user.keytab"principal="admintest@HADOOP.COM"useTicketCache=falsestoreKey=truedebug=true;};4.2 在本地etc/hosts文件添加主机与主机名映射添加内容格式为:主机IP  主机名  例如:192.162.23.221 192-162-23-2214.3 编辑ODBC的server.xml进入“C:\Program Files\openLooKeng\openLooKeng ODBC Driver 64-bit\odbc_gateway\mycat\conf”目录下,编辑server.xml中的协议前缀。将server.xml文件中属性值<property name="jdbcUrlPrefix">jdbc:lk://</property>修改为<property name="jdbcUrlPrefix">jdbc:presto://</property>4.4 keytab方式连接    1、编辑ODBC的wrapper.conf文件              a.         进入“C:\Program Files\openLooKeng\openLooKeng ODBC Driver 64-bit\odbc_gateway\mycat\conf”目录下,编辑wrapper.conf文件    增加JVM参数:wrapper.java.additional.13=-Djava.security.auth.login.config=C:\\hetu\\jaas-zk.confwrapper.java.additional.14=-Djava.security.krb5.conf=C:\\hetu\\krb5.confwrapper.java.additional.15=-Dzookeeper.auth.type=kerberoswrapper.java.additional.16=-Dzookeeper.server.principal=zookeeper/hadoop.hadoop.comwrapper.java.additional.17=-Dzookeeper.sasl.clientconfig=Client    其中java.security.auth.login.config 和 java.security.krb5.conf 需要根据自己的jaas和krb5 配置文件的存放路径而改变。  2、准备jdbc连接配置文件jdbc_param.propertiesa.       新建jdbc_param.properties文件,并添加如下内容进行配置user=admintest#password=123456SSL=trueSSLTrustStorePath=C:\\hetu\\hetuserver.jksKerberosRemoteServiceName=HTTPKerberosPrincipal=admintestKerberosServicePrincipalPattern=${SERVICE}@${HOST}KerberosConfigPath=C:\\hetu\\krb5.confKerberosKeytabPath=C:\\hetu\\user.keytabtenant=defaultdeploymentMode=on_yarnKerberosServicePrincipalPattern=${SERVICE}@${HOST}    4.5 用户名/密码方式连接   1、编辑ODBC的wrapper.conf文件a.         进入“C:\Program Files\openLooKeng\openLooKeng ODBC Driver 64-bit\odbc_gateway\mycat\conf”目录下,编辑wrapper.conf文件增加JVM参数:wrapper.java.additional.13=-Djava.security.krb5.conf=C:\\hetu\\krb5.conf        2、准备jdbc连接配置文件jdbc_param.propertiesa.       新建jdbc_param.properties文件,并添加如下内容进行配置user=admintestpassword=123456SSL=trueSSLTrustStorePath=C:\\hetu\\hetuserver.jksKerberosRemoteServiceName=HTTP#KerberosPrincipal=admintestKerberosServicePrincipalPattern=${SERVICE}@${HOST}KerberosConfigPath=C:\\hetu\\krb5.conf#KerberosKeytabPath=C:\\hetu\\user.keytabtenant=defaultdeploymentMode=on_yarn#KerberosServicePrincipalPattern=${SERVICE}@${HOST} 4.6 重启odbc服务:a.       进入“C:\Program Files\openLooKeng\openLooKeng ODBC Driver 64-bit\odbc_gateway\mycat\bin”目录b.       执行启动命令mycat.bat restart备注:每次修改配置时都需要停止odbc服务,修改完毕后再重启服务。五. 配置ODBC数据源连接5.1 在window 系统的控制面板中输入odbc搜索odbc的管理程序,如图: 5.2 应用程序中点击 “添加” ->  “openLooKeng ODBC 1.1 Driver”-> ”完成”5.3 填写名称和描述 5.4  点击Next后,填写URL, 选择JDBC配置文件,填写User Name 参数说明:参数样例说明Connection URL192.168.8.37:24002,192.168.8.38:24002,192.168.8.39:24002?serviceDiscoveryMode=zooKeeper&zooKeeperNamespace=hsbroker可通过HetuEngine的客户端hetu-cli启动时,记录连接的url,注意这里不需要输入前缀jdbc:presto://Connection ConfigC:\hetu\jdbc_param.properties4.4章节中创建的jdbc连接配置文件User Nameadmintest认证使用的用户名Password留空,实际值在配置文件中修改Catalog留空Schema留空5.5 测试连接点击Test DSN , 如下提示则为正常连接成功: 点击next, Finish 即可六. tableua对接6.1 选择“其他数据库(ODBC)”6.2  选择DSN, 选择第五章新建的数据源Hive1 6.3 点击 “连接” -> “登陆” 6.4 选择数据库,对数据进行操作即可:
  • [技术干货] 通过JDBC连接PostgreSQL数据库
    通过JDBC连接实例的方式有无需下载SSL证书连接和用户下载SSL证书连接两种,其中使用SSL证书连接通过了加密功能,具有更高的安全性。前提条件用户需要具备以下技能:熟悉计算机基础知识。了解java编程语言。了解JDBC基础知识。驱动获取及使用JDBC驱动下载地址:https://jdbc.postgresql.org/download.htmlJDBC接口使用指南请参考:https://jdbc.postgresql.org/documentation/head/index.html使用SSL证书连接说明:该方式属于SSL连接模式,需要下载SSL证书,通过证书校验并连接数据库。你可以在“实例管理”页面,单击实例名称进入“基本信息”页面,单击“数据库信息”模块“SSL”处的下载图标,下载根证书或**包。通过JDBC连接PostgreSQL数据库,代码中的JDBC链接格式如下:jdbc:postgresql://<instance_ip>:<instance_port>/<database_name>?sslmode=verify-full&sslrootcert=<ca.pem>参数说明:参数说明<instance_ip>如果通过弹性云服务器连接,“instance_ip”是主机IP,即“基本信息”页面该实例的“内网地址”。如果通过连接了公网的设备访问,“instance_ip”为该实例已绑定的“弹性公网IP”。<instance_port>端口,默认5432,当前端口,参考“基本信息”页面该实例的“数据库端口”。<database_name>数据库名,即需要连接的数据库名(默认的管理数据库是postgres)。sslmodessl连接模式,默认全认证模式。sslrootcertssl连接CA证书路径,该文件需放在执行该命令的路径下。连接PostgreSQL数据库的java代码,可参考以下示例import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class MyConnTest { final public static void main(String[] args) { Connection conn = null; // set sslmode here. // with ssl certificate and path. String url = "jdbc:postgresql://192.168.0.225:5432/my_db_test?sslmode=verify-full&sslrootcert=/home/Ruby/ca.pem"; try { Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection(url, "root", "password"); System.out.println("Database connected"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500"); while (rs.next()) { System.out.println(rs.getString(1)); } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("Test failed"); } finally { // release resource .... } } }无证书连接说明:该方式属于SSL连接模式,但不对服务端进行证书校验,用户无需下载SSL证书。通过JDBC连接RDS PostgreSQL数据库实例,代码中的JDBC链接格式如下:jdbc:postgresql://<instance_ip>:<instance_port>/<database_name>?sslmode=disable连接PostgreSQL数据库的java代码,可参考以下示例:import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class MyConnTest { final public static void main(String[] args) { Connection conn = null; // set sslmode here. // no ssl certificate, so do not specify path. String url = "jdbc:postgresql://192.168.0.225:5432/my_db_test?sslmode=disable"; try { Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection(url, "root", "password"); System.out.println("Database connected"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500"); while (rs.next()) { System.out.println(rs.getString(1)); } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("Test failed"); } finally { // release resource .... } } }
  • [技术干货] 如何通过JDBC连接MySQL数据库
    通过JDBC连接实例的方式有无需下载SSL证书连接和用户下载SSL证书连接两种,其中使用SSL证书连接通过了加密功能,具有更高的安全性。MySQL新实例默认关闭SSL数据加密,开启SSL请参考设置SSL数据加密。SSL连接实现了数据加密功能,但同时也会增加网络连接响应时间和CPU消耗,不建议开启SSL数据加密。前提条件用户需要具备以下技能:熟悉计算机基础知识。了解java编程语言。了解JDBC基础知识。使用SSL证书连接说明:该方式属于SSL连接模式,需要下载SSL证书,通过证书校验并连接数据库。通过JDBC连接MySQL数据库,代码中的JDBC链接格式如下:jdbc:mysql://<instance_ip>:<instance_port>/<database_name>?sslmode=verify-full&sslrootcert=<ca.pem>参数说明<instance_ip>如果通过弹性云服务器连接,“instance_ip”是主机IP,即“基本信息”页面该实例的“内网地址”。如果通过连接了公网的设备访问,“instance_ip”为该实例已绑定的“弹性公网IP”。<instance_port>端口,默认3306,当前端口,参考“基本信息”页面该实例的“数据库端口”。<database_name>数据库名,即需要连接的数据库名(默认的管理数据库是mysql)。sslmodessl连接模式,默认全认证模式。sslrootcertssl连接CA证书路径,该文件需放在执行该命令的路径下连接MySQL数据库的java代码,可参考以下示例:import java.sql.Connection;  import java.sql.DriverManager;  import java.sql.ResultSet;  import java.sql.Statement; import java.sql.SQLException;    public class MyConnTest {      final public static void main(String[] args) {          Connection conn = null;           Statement stat = null;        // set sslmode here.         // with ssl certificate and path.         String url = "jdbc:mysql://192.168.0.225:3306/my_db_test?sslmode=verify-full&sslrootcert=/home/Ruby/ca.pem";            try {              Class.forName("com.mysql.jdbc.Driver");              conn = DriverManager.getConnection(url, "root", "password");              System.out.println("Database connected");                Statement stmt = conn.createStatement();                String sql = "SELECT * FROM mytable WHERE columnfoo = 500";             ResultSet rs = stmt.executeQuery sql);              while (rs.next()) {                  System.out.println(rs.getString(1));              }                rs.close();              stmt.close();              conn.close();          } catch (Exception e) {              e.printStackTrace();              System.out.println("Test failed");          } finally {              // release resource ....          }      }  }无证书连接该方式属于SSL连接模式,但不对服务端进行证书校验,用户无需下载SSL证书。该方式属于SSL连接模式,但不对服务端进行证书校验,用户无需下载SSL证书。通过JDBC连接MySQL数据库实例,代码中的JDBC链接格式如下:jdbc:mysql://<instance_ip>:<instance_port>/<database_name>?sslmode=require参数说明<instance_ip>如果通过弹性云服务器连接,“instance_ip”是主机IP,即“基本信息”页面该实例的“内网地址”。如果通过连接了公网的设备访问,“instance_ip”为该实例已绑定的“弹性公网IP”。<instance_port>端口,默认3306,当前端口,参考“基本信息”页面该实例的“数据库端口”。<database_name>数据库名,即需要连接的数据库名(默认的管理数据库是mysql)。sslmodessl连接模式,require模式表示进行数据加密。连接MySQL数据库的java代码,可参考以下示例:import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class MyConnTest { final public static void main(String[] args) { Connection conn = null; // set sslmode here. // no ssl certificate, so do not specify path. String url = "jdbc:mysql://192.168.0.225:3306/my_db_test?sslmode=require"; try { Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection(url, "root", "password"); System.out.println("Database connected"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500"); while (rs.next()) { System.out.println(rs.getString(1)); } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("Test failed"); } finally { // release resource .... } } }
  • [技术干货] 【转载】JDBC练习--适合于新手或者温习jdbc(一个简易的在后台的学生信息的增删改查)
    一个简易的在后台的学生信息的增删改查(JDBC)1. 功能实现==运行程序控制台提示如下:==1.1 查询所有学生信息1.2 添加学生信息1.3 根据id修改学生信息1.4 根据id删除学生信息2. 代码实现2.1 导入数据库信息-- 1、创建数据库jt_db数据库(如果不存在才创建)create database if not exists jt_db charset utf8;use jt_db; -- 选择jt_db数据库-- 2、在 jt_db 库中创建 stu 表(学生表)drop table if exists stu;create table stu( stuid varchar(50), name varchar(50), gender char(2), addr varchar(50), score double);-- 3、往 stu 表中, 插入记录insert into stu values("1001",'张三','男', '北京', 86);2.2 编写JdbcUtil 工具类package cn.tedu;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;/** JDBC工具类 */public class JdbcUtil { /**  * 获取数据库连接对象并返回  * @return Connection对象  * @throws Exception   */ public static Connection getConn() throws Exception{ //1.注册驱动 Class.forName( "com.mysql.jdbc.Driver" ); //2.获取连接 Connection conn = DriverManager.getConnection( "jdbc:mysql:///jt_db?characterEncoding=utf-8",  "root",  "root"); return conn; } /**  * 释放JDBC程序中的资源  * @param conn 连接对象  * @param stat 传输器对象  * @param rs 结果集对象  */ public static void close(Connection conn,  Statement stat, ResultSet rs){ if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } finally{ rs = null; } } if(stat != null){ try { stat.close(); } catch (SQLException e) { e.printStackTrace(); } finally{ stat = null; } } if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } finally{ conn = null; } } } }==如果你的数据库有密码和用户名请使用自己的==2.3 编写studentManager的类package cn.tedu;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.Scanner;import com.tedu.util.JdbcUtil;/**  * 学生信息管理系统  * 运行程序,根据选项,可以对学生信息进行增删改查操作。  */public class StudentManager { private static Scanner sc = new Scanner(System.in); public static void main(String[] args) { while (true) { //1.提示选择操作选项 System.out.print("a:查询学生信息\t"); System.out.print("b:添加学生信息\t"); System.out.print("c:修改学生信息\t"); System.out.println("d:删除学生信息"); System.out.println("请输入操作,abcd任选一项:"); String opt = sc.nextLine(); //2.根据选项执行不同操作 if( "a".equalsIgnoreCase( opt ) ){ findAll(); //查询学生信息 }else if( "b".equalsIgnoreCase( opt ) ){ addStu(); //添加学生信息 }else if( "c".equalsIgnoreCase( opt ) ){ updateStu(); //修改学生信息 }else if( "d".equalsIgnoreCase( opt ) ){ deleteStu(); //删除学生信息 }else{ System.out.println("输入错误,请重新输入!"); } } } /** a. 查询所有学生信息 */ private static void findAll() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JdbcUtil.getConn(); String sql = "select * from stu"; ps = conn.prepareStatement(sql); rs = ps.executeQuery(); while(rs.next()){ String stuid = rs.getString("stuid"); String name = rs.getString("name"); String gender = rs.getString("gender"); String addr = rs.getString("addr"); double score = rs.getDouble("score"); System.out.println( stuid+","+name+","+gender +","+addr+","+score ); } System.out.println("------------------------------------------------------------------------------"); } catch (Exception e) { e.printStackTrace(); } } /** b. 添加学生信息 */ private static void addStu() { System.out.println("请输入要添加的学生编号:"); String stuid = sc.nextLine(); System.out.println("请输入姓名:"); String name = sc.nextLine(); System.out.println("请输入性别:"); String gender = sc.nextLine(); System.out.println("请输入地址:"); String addr = sc.nextLine(); System.out.println("请输入成绩:"); double score = Double.parseDouble(sc.nextLine()); Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JdbcUtil.getConn(); String sql = "insert into stu values(?,?,?,?,?)"; ps = conn.prepareStatement(sql); ps.setString(1, stuid); ps.setString(2, name); ps.setString(3, gender); ps.setString(4, addr); ps.setDouble(5, score); int rows = ps.executeUpdate(); if (rows > 0) { System.out.println("添加成功!"); } } catch (Exception e) { e.printStackTrace(); } } /** c. 根据id修改学生信息 */ private static void updateStu() { System.out.println("请输入要修改的学生编号:"); String stuid = sc.nextLine(); System.out.println("请输入要修改的姓名:"); String name = sc.nextLine(); System.out.println("请输入要修改的性别:"); String gender = sc.nextLine(); System.out.println("请输入要修改的所在地址:"); String addr = sc.nextLine(); System.out.println("请输入要修改的成绩:"); double score = Double.parseDouble(sc.nextLine()); Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JdbcUtil.getConn(); String sql = "update stu set name=?,gender=?" + ",addr=?,score=? where stuid=?"; ps = conn.prepareStatement(sql); ps.setString(1, name); ps.setString(2, gender); ps.setString(3, addr); ps.setDouble(4, score); ps.setString(5, stuid); int rows = ps.executeUpdate(); if (rows > 0) { System.out.println("修改成功!"); } } catch (Exception e) { e.printStackTrace(); } } /** d. 根据id删除学生信息 */ private static void deleteStu() { System.out.println("请输入要删除的学生编号:"); String stuid = sc.nextLine(); Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JdbcUtil.getConn(); String sql = "delete from stu where stuid=?"; ps = conn.prepareStatement(sql); ps.setString(1, stuid); int rows = ps.executeUpdate(); if (rows > 0) { System.out.println("删除成功!"); } } catch (Exception e) { e.printStackTrace(); } } }2.4 加载项目,使它在服务器上运行成功GOOD GOOD STUDYDAY DAY UP结束,谢谢!!!!!!!!!!!!!!!!文章来源: www.oschina.net,作者:其乐m,版权归原作者所有,如需转载,请联系作者。原文链接:https://my.oschina.net/u/4115134/blog/3195361
  • [版主交流] 想用Spark通过JDBC驱动连接ELK查询数据库表,报错失败。。。
    1、Maven pom.xml配置如下:    postgresql     postgresql     9.1-901-1.jdbc42、通过Spark连接JDBC的java代码如下:Properties connectionProperties = Properties(); String url = ; connectionProperties.put(,); connectionProperties.put(,); connectionProperties.put(,); connectionProperties.setProperty(,url); SparkSession sparkSson = SparkSession.().appName().master().getOrCreate(); Dataset<Row> dataset = sparkSson.read().jdbc(connectionProperties.getProperty(),,connectionProperties).persist(); dataset.show(); sparkSson.close(); 3、报错信息如下: Exception in thread "main" org.postgresql.util.PSQLException: 不支援 10 验证类型。请核对您已经组态 pg_hba.conf 文件包含客户端的IP位址或网路区段,以及驱动程序所支援的验证架构模式已被支援。 at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:403) at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:108) at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66) at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125) at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30) at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22) at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:32) at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24) at org.postgresql.Driver.makeConnection(Driver.java:393) at org.postgresql.Driver.connect(Driver.java:267) 求论坛大神指导,这是个什么错,怎么解决?
  • [应用案例] 实际操作笔记丨JDBC问题定位指南
    JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集。JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批组件之一。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/174793
  • [技术干货] Java中JDBC的使用详解(四)
    五、使用数据库连接池  1、原因       1.传统连接方法缺点:用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。2.数据库连接池 2、开源连接池         1.DBCP 数据库连接池 工具类如下:JdbcUtils_DBCPimport java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties;   import javax.sql.DataSource;   import org.apache.commons.dbcp.BasicDataSourceFactory;     public class JdbcUtils_DBCP { private static DataSource ds = null; static{ try{ InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"); Properties prop = new Properties(); prop.load(in); BasicDataSourceFactory factory = new BasicDataSourceFactory(); ds = factory.createDataSource(prop); System.out.println(ds); }catch (Exception e) { throw new ExceptionInInitializerError(e); } } public static Connection getConnection() throws SQLException{ return ds.getConnection(); } public static void release(Connection conn,Statement st,ResultSet rs){ if(rs!=null){ try{ rs.close(); }catch (Exception e) { e.printStackTrace(); } rs = null;   } if(st!=null){ try{ st.close(); }catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try{ conn.close(); }catch (Exception e) { e.printStackTrace(); } } } }    2.C3P0 数据库连接池连接工具类:JdbcUtils_C3p0(自己在这里更改)import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties;   import javax.sql.DataSource;   import org.apache.commons.dbcp.BasicDataSourceFactory;   import com.mchange.v2.c3p0.ComboPooledDataSource;     public class JdbcUtils_C3P0 { private static ComboPooledDataSource ds = null; static{ try{ ds = new ComboPooledDataSource(); ds.setDriverClass("com.mysql.jdbc.Driver"); ds.setJdbcUrl("jdbc:mysql://localhost:3306/day16"); ds.setUser("root"); ds.setPassword("root"); ds.setInitialPoolSize(10);//最初连接数 ds.setMinPoolSize(5);//最小连接数 ds.setMaxPoolSize(20);//最大连接数 }catch (Exception e) { throw new ExceptionInInitializerError(e); } } public static Connection getConnection() throws SQLException{ return ds.getConnection(); } public static void release(Connection conn,Statement st,ResultSet rs){ if(rs!=null){ try{ rs.close(); }catch (Exception e) { e.printStackTrace(); } rs = null;   } if(st!=null){ try{ st.close(); }catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try{ conn.close(); }catch (Exception e) { e.printStackTrace(); } } } }也可以将配置信息放在xml文件中(src下):c3p0-config.xml<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property> <property name="user">root</property> <property name="password">root</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> </default-config> <named-config name="mysql"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property> <property name="user">root</property> <property name="password">root</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> </named-config> <named-config name="oracle"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property> <property name="user">root</property> <property name="password">root</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> </named-config> </c3p0-config>这样JdbcUtils_C3p0可以改为: /*             ds = new ComboPooledDataSource(); ds.setDriverClass("com.mysql.jdbc.Driver"); ds.setJdbcUrl("jdbc:mysql://localhost:3306/day16"); ds.setUser("root"); ds.setPassword("root"); ds.setInitialPoolSize(10);//最初连接数 ds.setMinPoolSize(5);//最小连接数 ds.setMaxPoolSize(20);//最大连接数             */              ds = new ComboPooledDataSource(""mysql"");//如果默认()
  • [技术干货] Java中JDBC的使用详解(二)
    接着上面的说:4、获取结果         Jdbc程序中的ResultSet用于代表Sql语句的执行结果。        Resultset封装执行结果时,采用的类似于表格的方式,        ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,        游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,        进行调用方法获取该行的数据。1、获取行ResultSet提供了对结果集进行滚动的方法:next():移动到下一行Previous():移动到前一行absolute(int row):移动到指定行beforeFirst():移动resultSet的最前面。afterLast() :移动到resultSet的最后面。2、获取值ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:            获取任意类型的数据                        getObject(int index)                        getObject(string columnName)    获取指定类型的数据,例如                            getString(int index)                    getString(String columnName)    常用数据类型转换:            SQL类型Jdbc对应方法返回类型tinyintgetByte()getByte()getByte()getShort()Short()intgetintintbigintbigintLongchar,varchar,longvarchargetStringStringtext(clob) blobgetClob()Clob  bolbdategetDatajava.sql.DatetimegetTimejava.sql.TimetimestampgetTimestampjava.sql.TimestampResultSet rs = null; //4.向数据库发sql,并获取代表结果集的resultset String sql = "select id,name,password,email,birthday from users"; rs = st.executeQuery(sql); //5.取出结果集的数据 rs.afterLast(); rs.previous(); System.out.println("id=" + rs.getObject("id")); System.out.println("name=" + rs.getObject("name")); System.out.println("password=" + rs.getObject("password")); System.out.println("email=" + rs.getObject("email")); System.out.println("birthday=" + rs.getObject("birthday"));或者://循环取出(id) while(rs.next()) { String id=rs.getString(1);//1代表数据库中表的列数,id在第一列也可以("id")!!! System.out.println(id+" "); }5、释放资源     Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,    这些对象通常是ResultSet, Statement和Connection对象。注意:为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。//6.关闭链接,释放资源 if(rs!=null){ try{ rs.close(); }catch (Exception e) { e.printStackTrace(); } rs = null; } if(st!=null){ try{ st.close(); }catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try{ conn.close(); }catch (Exception e) { e.printStackTrace(); } }
  • [技术干货] Java中JDBC的使用详解(一)
    一、环境介绍mysql中创建一个库shen,并创建user表和插入表的数据。新建一个Java工程jdbc,并导入数据驱动。二、详细步骤 1、加载数据库驱动//1.加载驱动(开发推荐的方式) Class.forName("com.mysql.jdbc.Driver");注意:如果连接的是SQL server//1.加载驱动 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");2、建立连接  1、数据库URL  URL用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:  jdbc:mysql:[]//localhost:3306/shen ?参数名:参数值  常用数据库URL地址的写法:       Oracle:jdbc:oracle:thin:@localhost:1521:shen       SqlServer:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=shen       MySql:jdbc:mysql://localhost:3306/shen注意:如果是localhost:3306,mysql可以简写为jdbc:mysql:///sid(尽量不这样)2、Connection  Jdbc程序中的Connection,它用于代表数据库的链接,Collection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的,创建方法为:Connection conn = DriverManager.getConnection(url,user,pass); 这个对象的常用方法:String url = "jdbc:mysql://localhost:3306/shen"; String username = "shen"; String password = "Anxin062039"; Connection conn = null; //2.获取与数据库的链接 conn = DriverManager.getConnection(url, username, password);3、执行SQL语句1、Statement        Jdbc程序中的Statement对象用于向数据库发送SQL语句,创建方法为:                                     Statement st = conn.createStatement();Statement对象常用方法:Statement st = null; //3.获取用于向数据库发送sql语句的statement st = conn.createStatement(); //4.向数据库发sql String sql = "select id,name,password,email,birthday from users"; st.executeQuery(sql);2、PreperedStatement         PreperedStatement是Statement的孩子,它的实例对象可以通过调用:                                 PreperedStatement st =  conn.preparedStatement()PreperedStatement st = null; String sql = "select * from users where name=? and password=?";   //3.获取用于向数据库发送sql语句的Preperedstatement st = conn.preparedStatement(sql);//在此次传入,进行预编译 st.setString(1, username); st.setString(2, password); //4.向数据库发sql st.executeQuery();//在这里不需要传入sql比较:相对于Statement对象而言PreperedStatement可以避免SQL注入的问题如:String sql="select * from admin where loginname='"+loginName+"' and loginpwd='"+loginPwd+"'";                  在应用中:                            -》请输入账号:                                 333                            -》请输入密码:                                  wer'or'1'='1    实际上发送:select * from admin where loginname='333' and loginpwd='wer'or'1'='1',登录成功! Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。PreparedStatement 可对SQL进行预编译,从而提高数据库的执行效率。并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。                 
  • [技术干货] jdbc连接数据库的5个步骤
    import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;     public class connectionMysql {     public static void main(String[] args) {          String driver="com.mysql.jdbc.Driver";//驱动路径          String password="123456";//用户密码          try {              //1、加载驱动              Class.forName(driver);              //2、链接数据库              Connection con = DriverManager.getConnection(url, user, password);              if(!con.isClosed()){//判断数据库是否链接成功                 System.out.println("已成功链接数据库!");                 //3、创建Statement对象                 Statement st = con.createStatement();                  //4、执行sql语句                  String sql="select *from user";//查询user表的所有信息                  ResultSet rs = st.executeQuery(sql);//查询之后返回结果集                  //5、打印出结果                  while(rs.next()){                         System.out.println(rs.getString("Id")+"\t"+rs.getString("name")+"\t"+rs.getString("password"));            }             }                  rs.close();//关闭资源                  con.close();//关闭数据库             }             } catch (Exception e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              }          }      }
  • [技术干货] 如何通过JDBC连接MySQL数据库
            通过JDBC连接实例的方式有无需下载SSL证书连接和用户下载SSL证书连接两种,其中使用SSL证书连接通过了加密功能,具有更高的安全性。MySQL新实例默认关闭SSL数据加密,开启SSL请参考设置SSL数据加密。SSL连接实现了数据加密功能,但同时也会增加网络连接响应时间和CPU消耗,不建议开启SSL数据加密。前提条件用户需要具备以下技能:熟悉计算机基础知识。了解java编程语言。了解JDBC基础知识。使用SSL证书连接说明: 该方式属于SSL连接模式,需要下载SSL证书,通过证书校验并连接数据库。可以在华为云的“实例管理”页面,单击实例名称进入“基本信息”页面,单击“数据库信息”模块“SSL”处的下载按钮,下载根证书或**包。通过JDBC连接MySQL数据库,代码中的JDBC链接格式如下:jdbc:mysql://<instance_ip>:<instance_port>/<database_name>?sslmode=verify-full&sslrootcert=<ca.pem>参数说明<instance_ip>如果通过弹性云服务器连接,“instance_ip”是主机IP,即“基本信息”页面该实例的“内网地址”。如果通过连接了公网的设备访问,“instance_ip”为该实例已绑定的“弹性公网IP”。<instance_port>端口,默认3306,当前端口,参考“基本信息”页面该实例的“数据库端口”。<database_name>数据库名,即需要连接的数据库名(默认的管理数据库是mysql)。sslmodessl连接模式,默认全认证模式。sslrootcertssl连接CA证书路径,该文件需放在执行该命令的路径下。连接MySQL数据库的java代码,可参考以下示例:import java.sql.Connection;  import java.sql.DriverManager;  import java.sql.ResultSet;  import java.sql.Statement; import java.sql.SQLException;    public class MyConnTest {      final public static void main(String[] args) {          Connection conn = null;           Statement stat = null;     // set sslmode here.            // with ssl certificate and path.               String url = "jdbc:mysql://192.168.0.225:3306/my_db_test?sslmode=verify-full&sslrootcert=/home/Ruby/ca.pem";            try {              Class.forName("com.mysql.jdbc.Driver");              conn = DriverManager.getConnection(url, "root", "password");              System.out.println("Database connected");                Statement stmt = conn.createStatement();                String sql = "SELECT * FROM mytable WHERE columnfoo = 500";             ResultSet rs = stmt.executeQuery sql);              while (rs.next()) {                  System.out.println(rs.getString(1));              }                rs.close();              stmt.close();              conn.close();          } catch (Exception e) {              e.printStackTrace();              System.out.println("Test failed");          } finally {              // release resource ....          }      }  }无证书连接说明: 该方式属于SSL连接模式,但不对服务端进行证书校验,用户无需下载SSL证书。通过JDBC连接MySQL数据库实例,代码中的JDBC链接格式如下:jdbc:mysql://<instance_ip>:<instance_port>/<database_name>?sslmode=require参数说明<instance_ip>如果通过弹性云服务器连接,“instance_ip”是主机IP,即“基本信息”页面该实例的“内网地址”。如果通过连接了公网的设备访问,“instance_ip”为该实例已绑定的“弹性公网IP”。<instance_port>端口,默认3306,当前端口,参考“基本信息”页面该实例的“数据库端口”。<database_name>数据库名,即需要连接的数据库名(默认的管理数据库是mysql)。sslmodessl连接模式,require模式表示进行数据加密。连接MySQL数据库的java代码,可参考以下示例:import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class MyConnTest { final public static void main(String[] args) { Connection conn = null; // set sslmode here. // no ssl certificate, so do not specify path. String url = "jdbc:mysql://192.168.0.225:3306/my_db_test?sslmode=require"; try { Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection(url, "root", "password"); System.out.println("Database connected"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500"); while (rs.next()) { System.out.println(rs.getString(1)); } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("Test failed"); } finally { // release resource .... } } }
  • [对接系列] GaussDB(DWS) 【如何在JDBC连接DWS时设置(set)guc参数】
            基于DWS进行客户业务调优时经常会识别到部分业务场景需调整数据库guc参数,如果全局调整参数可能会对其他业务场景产生影响,因此需要会话级别调整guc参数,连接DWS业务程序大多通过JDBC与DWS进行数据交互,因此我们可以在业务程序调用JDBC连接数据库时进行数据库参数设置,代码样例如下:import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class paraset {  //创建数据库连接。  public static Connection GetConnection(String username, String passwd) {    String driver = "org.postgresql.Driver";    String sourceURL = "jdbc:postgresql://***.***.***.***:25308/postgres";    Connection conn = null;    try {      //加载数据库驱动。      Class.forName(driver).newInstance();    } catch (Exception e) {      e.printStackTrace();      return null;    }    try {      //创建数据库连接。      conn = DriverManager.getConnection(sourceURL, username, passwd);      System.out.println("Connection succeed!");    } catch (Exception e) {      e.printStackTrace();      return null;    }    return conn;  };  //执行guc 参数设置,并查看设置结果  public static void ParaSet(Connection conn) {    Statement stmt = null;    try {      stmt = conn.createStatement();      //set前查看下参数初始值      ResultSet rs = stmt.executeQuery("select name,setting from pg_settings where name ='enable_index_nestloop'");      while (rs.next()) {          System.out.println(rs.getString(1)+" "+rs.getString(2));          }      //设置参数为off      boolean rc = stmt.execute("set enable_index_nestloop=off;");      System.out.println(rc);      //设置完成后查看参数是否设置成功       rs = stmt.executeQuery("select name,setting from pg_settings where name ='enable_index_nestloop'");      while (rs.next()) {          System.out.println(rs.getString(1)+" "+rs.getString(2));          }          rs.close();      stmt.close();    } catch (SQLException e) {      if (stmt != null) {        try {          stmt.close();        } catch (SQLException e1) {          e1.printStackTrace();        }      }      e.printStackTrace();    }  }  /**   * 主程序,逐步调用各静态方法。   * @param args  */  public static void main(String[] args) {    //创建数据库连接。    Connection conn = GetConnection("user", "password");    //设置参数。    ParaSet(conn);    //关闭数据库连接。    try {      conn.close();    } catch (SQLException e) {      e.printStackTrace();    }  }}执行结果如下:
  • [问题求助] 云数据库RDS基于JDBC开发时,连接数据库操作中怎么修改配置文件zengine.ini?
    在之前的步骤之中只是加载了jar包,安装了驱动,第三步连接时这个配置文件zengine.ini怎么来的呢?
  • sqlite-jdbc-3.8.11.2.jar移植指南
    1 简介SQLite JDBC 是一个用于使用Java 访问和创建SQLite数据库文件的库。 2 编译环境准备2.1 安装Openjdk下载并安装到指定目录(如/opt/tools/installed):wget  https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u191-b12/OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gztar   -zxf OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gzmv jdk8u191-b12   /opt/tools/installed/配置java环境变量,在/etc/profile文件末尾处增加下面的代码:JAVA_HOME=/opt/tools/installed/jdk8u191-b12PATH=$JAVA_HOME/bin:$PATHexport   JAVA_HOME PATH运行下面命令,使修改的环境变量生效:source   /etc/profile2.2 安装Maven下载并安装到指定目录(如/opt/tools/installed):wget   https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gztar   -zxf apache-maven-3.5.4-bin.tar.gzmv   apache-maven-3.5.4 /opt/tools/installed/修改maven环境变量,在/etc/profile文件末尾增加下面高亮代码:JAVA_HOME=/opt/tools/installed/jdk8u191-b12MAVEN_HOME=/opt/tools/installed/apache-maven-3.5.4PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATHexport   MAVEN_HOME   JAVA_HOME PATH运行下面的命令,是修改的环境变量生效:source   /etc/profile2.3 安装Gcc等依赖项挂载OS镜像:mount   YOUR_OS.iso /media -o loop修改/etc/yum.repos.d/Base.repo文件,配置yum本地源:[Local]name=CentOS-7.4   Localbaseurl=file:///media/enabled=1gpgcheck=0运行下面的命令,使yum源配置生效:yum   clean allyum   makecacheyum安装GCC等相关依赖:yum   install git gcc gcc-c++ make cmake libtool autoconf automake -y2.4 解决-fsigned-char问题1.使用command -v gcc命令寻找gcc所在路径(一般位于/usr/bin/gcc)2.更改gcc的名字(比如改成gcc-impl)3.在gcc所在目录执行vim gcc,并填入如下内容保存:#!   /bin/sh/usr/bin/gcc-impl   -fsigned-char “$@”4.执行chmod +x gcc给脚本添加执行权限5.使用与1-4步相似的方式给g++创建同名字的脚本文件3 组件编译安装下载sqlite-jdbc-3.8.11.2源码,并解压wget https://github.com/xerial/sqlite-jdbc/archive/3.8.11.2.zipunzip 3.8.11.2.zipcd sqlite-jdbc-3.8.11.2修改Makefile:执行编译:make 
  • Mybatis解决jdbc编程的问题
        (1)数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。(2)Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。(3)向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。(4)对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。