Flink是适合流计算和批处理,不管是哪种方式,主要的重点是对数据的处理计算。如果想作为一个web项目实时的访问某个数据库,这样的方式就会有点不太合适,但是也有更好的方式结合Druid使用,可以自行去CSDN上下载 https://www.iteye.com/resource/cx361006796-10638225
以下是两种方式去访问关系型数据库,一、自定义的Source,二、重写JDBCInputFormat然后在里面重写一些方法实现数据库连接池的修改。
Flink的自定义Source的方式实现连接关系型数据库
package com.connect.hbase
import java.sql.{Connection, DriverManager, PreparedStatement, ResultSet}
import org.apache.flink.configuration.Configuration
import org.apache.flink.streaming.api.functions.source.SourceFunction.SourceContext
import org.apache.flink.streaming.api.functions.source.{RichSourceFunction, SourceFunction}
class MySourceOracle extends RichSourceFunction[Person]{
var ps:PreparedStatement = null
var connection:Connection =null
val driver = "oracle.jdbc.driver.OracleDriver"
val url = "jdbc:oracle:thin:@192.168.10.10:1521:orcl"
val username = "test"
val password = "test"
override def open(parameters:Configuration ) {
super.open(parameters)
// 获取连接
connection = getConn
}
def getConn = {
try {
// connection = dataSource.getConnection
Class.forName(driver)
connection = DriverManager.getConnection(url, username, password)
} catch {
case e: Exception =>
e.printStackTrace()
}
connection
}
def run(ctx: SourceContext[Person]): Unit = {
//执行查询
ps = connection.prepareStatement("select YEAR_DESC AS name,DAY_ID AS age from TP_GL_DAY where DAY_ID = '20141007'")
val resultSet:ResultSet = ps.executeQuery
while (resultSet.next) {
val p = new Person(resultSet.getString("name"),resultSet.getString("age"))
println("*****************year=>"+p.name+"*********age=>"+p.age)
// 将数据发送出去
// ctx.collect(p)
}
}
override def cancel(): Unit = {}
@throws[Exception]
override def close(): Unit = {
super.close
if (connection != null) connection.close
if (ps != null) ps.close
}
}
//测试类
object TestSource {
def main(args: Array[String]): Unit = {
// 调用程序// 调用程序
val env = StreamExecutionEnvironment.getExecutionEnvironment
// 添加自定义数据源
val data = env.addSource(new MySourceOracle)
data.print.setParallelism(1)
// 提交执行任务
val result = env.execute("TestSource")
System.out.println(result.getJobID)
}
}
class Person{
var name = "lisi"
var age="12"
def this(name:String,age:String){
this()
this.name=name
this.age=age
}
}
Flink使用 JDBCInputFormat 的方式连接数据库
var jdbc = JDBCInputFormat1.buildJDBCInputFormat()
// 数据库连接驱动名称
.setDrivername(parameter.get("oracleDriverClass").get.toString)
// 数据库连接地址
.setDBUrl(parameter.get("oracleDriverUrl").get.toString)
// 数据库连接用户名
.setUsername(parameter.get("oracleUsername").get.toString)
// 数据库连接密码
.setPassword(parameter.get("oraclePassword").get.toString)
// 数据库连接查询SQL
.setQuery(sql)
//加入sql中的参数
.setParametersProvider(paramProvider)
// 字段类型,顺序个个数必须与SQL保持一致
.setRowTypeInfo(rowTypeInfo)
.finish()
val inputOracle: Da