第二课笔记 Java动态代理和JDBC

昨天的问题
       (扩展)留一个问题?DeadLock.java ---> 产生一个死锁
       (*) 如果java产生了死锁,怎么找到死锁?---> 诊断工具:Thread Dump(文本) ---> 包含了JVM所有Java线程的状态
              Windonw:  Ctrl+Break 键(fn+B)
              Linux命令:    kill -3 pid
                     Java stack information for the threads listed above:
                     ===================================================
                     "Thread-1":
                                   at ThreadB.run(DeadLock.java:68)
                                   - waiting to lock <0xa0a46258> (a java.lang.Object)
                                   - locked <0xa0a46260> (a java.lang.Object)
                     "Thread-0":
                                   at ThreadA.run(DeadLock.java:41)
                                   - waiting to lock <0xa0a46260> (a java.lang.Object)
                                   - locked <0xa0a46258> (a java.lang.Object)

                     Found 1 deadlock.


一、JDBC基础

              1、学习大数据,需要JDBC?---> 参考课程讲义:Hadoop和Spark
                     (1) hadoop: 数据仓库Hive  ---> 支持JDBC方式
                     (2) spark: 支持JDBC

              2、什么是JDBC? 标准的API接口
                     主要的类和接口:
                     (1)类:DriverManager  管理数据库驱动(jar包)
                     (2)接口:Connection 数据库的链接
                              Statement  SQL的运行环境 
                              ResultSet  select的结果

              3、开发JDBC程序
                     (1)Java程序
                     (2)开发一个Spark的JDBC程序
                                   (*) 执行开发JDBC
                                   (*) Spark提供API: JdbcRDD.scala  ---> 执行select

                      Scala语言:看成Java升级版
 
                     大数据的处理过程:

                            数据(txt文件)  ---> Spark任务中   ------> JDBC的方式,保存到Oracle数据库


二、 Scala语言

package oracle

import java.sql.{Connection, DriverManager, PreparedStatement}

import org.apache.spark.{SparkConf, SparkContext}

object DemoOracle {

  //定义主方法
  def main(args: Array[String]): Unit = {
    //创建一个SparkContext对象
    //setMaster("local") 在本地运行Spark任务
    val conf = new SparkConf().setAppName("My Oracle Demo 1").setMaster("local")
    val sc = new SparkContext(conf)

    //读入数据  ---> RDD集合 ---> 有分区组成 ---> 通过迭代器
    //使用RDD的算子----> 方法
    val rdd1 = sc.textFile("d:\\temp\\student.txt").map(line =>{
        //对读入的每一行进行操作  1,Tom,23  ---> 集合
        //分词
        val words = line.split(",")  //words 看成一个数组

        //返回这行 的结果 ---> 元组
        (words(0),words(1),words(2))
    })

    //输出
    //println(rdd1.collect().toBuffer)

    //将结果存入Oracle
    rdd1.foreachPartition(saveToOracle)

    sc.stop()
  }

  //定义一个方法将数据存入Oracle:  insert
  //参数:分区中的迭代器
  def saveToOracle(it:Iterator[(String,String,String)]) ={
      //JDBC程序
    var conn:Connection = null
    var pst:PreparedStatement = null

    try{
      //得到Connection
      conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.88.101:1521/orcl.example.com","scott","tiger")
      //创建运行环境
      pst = conn.prepareStatement("insert into student values(?,?,?)")

      //通过循环将每个分区中迭代器中的数据插入到Oracle
      //data:  [1,Tom,23]
      it.foreach(data =>{
          pst.setInt(1,data._1.toInt)
          pst.setString(2,data._2)
          pst.setInt(3,data._3.toInt)

         pst.executeUpdate()
      })

    }catch{
      case e1:Exception => println("Some Error Happened." +e1.getMessage)
    }finally {
      //释放资源
      if(pst != null) pst.close()
      if(conn != null) conn.close()
    }
  }
}




package oracle

import java.sql.DriverManager

import org.apache.spark.rdd.JdbcRDD
import org.apache.spark.{SparkConf, SparkContext}

object DemoOracle1 {

  //定义变量代表数据库的链接
  //可以把函数付给变量
  var connection = () =>{
    DriverManager.getConnection("jdbc:oracle:thin:@192.168.88.101:1521/orcl.example.com","scott","tiger")
  }


  def main(args: Array[String]): Unit = {
    //创建一个SparkContext对象
    //setMaster("local") 在本地运行Spark任务
    val conf = new SparkConf().setAppName("My Oracle Demo 1").setMaster("local")
    val sc = new SparkContext(conf)

    //执行查询:  select * from emp where deptno=? and sal > ?
    /*
       参数说明:
       sc : org.apache.spark.SparkContext,                     SparkContext对象
       getConnection : scala.Function0[java.sql.Connection],   数据库的链接
       sql : scala.Predef.String,                              SQL语句
       lowerBound : scala.Long,                                下边界:SQL语句的第一个参数
       upperBound : scala.Long,                                上边界:SQL语句的第二个参数
       numPartitions : scala.Int,                               结果RDD的分区数
       mapRow : scala.Function1[java.sql.ResultSet, T]          查询的结果
     */
    val oracleRdd = new JdbcRDD(sc,connection,"select * from emp where deptno=? and sal>?",10,2000,1,r=>{
      //通过匿名函数处理
      var ename = r.getString("ename")
      var sal = r.getInt("sal")
      //返回结果
      (ename,sal)
    })

    //执行任务
    val result = oracleRdd.collect()
    println(result.toBuffer)

    //停止
    sc.stop()
  }
}

三、为什么需要知道JDBC?

  • 因为:Hive
  • 构建在Hadoop上的数据仓库平台,为数据仓库管理提供了许多功能
  • 起源自facebook由Jeff Hammerbacher领导的团队
  • 2008年facebook把hive项目贡献给Apache
  • 定义了一种类SQL语言HiveQL。可以看成是仍SQL到Map-Reduce的映射器
  • 提供Hive shell、JDBC/ODBC、Thrift客户端等接


四、为什么需要Java动态代理对象

    备注: 在linux下,执行hadoop命令是: #hdsfs dfs-put a.avi /move , 中间的hdfs dfs 是hadoop的命令前缀




五、什么是Java的动态代理?



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值