gpt4 book ai didi

mysql - 二进制文件到 SQL 数据库 Apache Camel

转载 作者:可可西里 更新时间:2023-11-01 08:36:46 25 4
gpt4 key购买 nike

我需要一些指导,了解使用哪种方法使用 Camel 将二进制文件从文件夹加载到 MySQL 数据库中。基本上我想将我们 PBX 系统的语音日志存储到数据库中。包含语音日志的目录将是一个远程目录

我设计了一个原型(prototype),但我不确定这是否真的有效,它可以工作,但我对设计不满意。让我解释一下我在做什么。 Camel 路线如下:

    <camelContext xmlns="http://camel.apache.org/schema/spring">
<package>com.hia.camelone</package>
<route>
<from uri="file://c:/CTest/Inbox?noop=true&amp;recursive=true&amp;delay=3000"/>
<to uri="bean://fileToSQL"/>
<to uri="jdbc://timlogdb"/>

</route>

</camelContext>

<bean id="timlogdb" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value=" com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/TimLog" />
<property name="username" value="root" />
<property name="password" value="blahblah" />
</bean>
<bean id="fileToSQL" class="com.hia.camelone.fileToSQL"/>

fileToSQL bean 的代码是:

public class fileToSQL {

public String toString(@Headers Map<String,Object> header, @Body Object body){
StringBuilder sb = new StringBuilder();
String filename =(String)header.get("CamelFileNameOnly");
String escapedFileName = StringEscapeUtils.escapeJava(filename).replace("\'", "");
String filePath = StringEscapeUtils.escapeJava((String)header.get("CamelFilePath"));

sb.append("insert into FileLog ");
sb.append("(FileName,FileData) values (");
sb.append("'").append(escapedFileName).append("',").append("LOAD_FILE(\"").append(filePath).append("\")");
sb.append(")");
System.out.println(sb.toString());
System.out.println(body);
System.out.println(header.toString());
return sb.toString();
}
}

好的简短说明我让文件组件使用文件,然后我使用 MySQL LOAD_FILE() 函数构建一个 SQL 字符串来加载文件。

我对此的看法:

LOAD_FILE 函数仅适用于本地机器,因此该路由仅适用于本地机器上的文件。我可以使用文件生成器将文件从某个远程目录复制到本地目录,然后使用路由。那么我的路线将是这样的:

<route>
<from uri="file://c:/CTest/Inbox?noop=true&amp;recursive=true&amp;delay=3000"/>
<to uri="file://c:/outbox"/>
<to uri="bean://fileToSQL"/>
<to uri="jdbc://timlogdb"/>

</route>

但是,由于我可以访问来自文件消费者的消息中的文件内容,理论上我应该能够访问字符串的主体/内容并构建一个不使用 LOAD_FILE() 函数的 SQL 命令.

我知道如何构建这样一个字符串的唯一方法是使用 JDBC 的准备好的语句。如果我能以某种方式使用文件使用者的内容构建插入语句,这将是一等奖。

我可以在我的 fileToSQL bean 中创建准备好的语句并将其传递到我的 jdbc 组件吗?或者如何在没有 LOAD_FILE() 函数的情况下构建 INSERT 语句?

因为我必须使用 LOAD_FILE() 函数,所以我现在必须同时满足 unix 和 windows 文件路径。虽然这应该不难,但我只是不喜欢将特定于操作系统的代码放入我的应用程序中的想法(感觉像是一种解决方法)。

这里有人曾经使用 Camel 将二进制文件上传到 MySQL 数据库,他们可以就上述几点给我一些指导。虽然我可以解决这些问题,但我只想确保我不会错过明显的做事方式。

我环顾四周,只发现人们主要使用文本文件。伙计们,请不要走我将文件存储在文件系统上并将其链接到数据库的路线。我们有一些非常具体的灾难恢复要求和法律要求,强制要求我将其存储在数据库中。

最佳答案

是的,所以我设法找到了一种方法,而且并不难。我基本上所做的是摆脱路由中的 JDBC Camel 组件。然后我将数据源 bean 注入(inject)到我的 fileToSQL bean 中。然后,我使用一个简单的准备语句将文件及其名称插入到 MySQL 中。

一如既往,代码比我的英语更明确。

 <camelContext xmlns="http://camel.apache.org/schema/spring">
<package>com.hia.camelone</package>

<route>
<from uri="file://c:/CTest/Inbox?noop=true&amp;recursive=true&amp;delay=3000"/>
<to uri="bean://fileToSQL"/>
<!--<to uri="jdbc://timlogdb"/>-->

</route>

</camelContext>

<bean id="timlogdb" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value=" com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/TimLog" />
<property name="username" value="root" />
<property name="password" value="lalala" />
</bean>
<bean id="fileToSQL" class="com.hia.camelone.fileToSQL">
<property name="dataSource" ref="timlogdb"/>
</bean>

如您所见,我将我的 timlogdb bean 注入(inject)到我的 fileToSQL bean 中。 Spring 的岩石!

这是我的 fileToSQL bean。

public class fileToSQL {
private DriverManagerDataSource dataSource;
private static final String SQL_INSERT="insert into FileLog(FileName,FileData)values(?,?)";
@Handler
public void toString(@Headers Map<String,Object> header,Exchange exchange){
Connection conn = null;
PreparedStatement stmt=null;
String filename =StringEscapeUtils.escapeJava(((String)header.get("CamelFileNameOnly")).replace("\'", ""));

try {
conn= dataSource.getConnection();
stmt =conn.prepareStatement(SQL_INSERT);
stmt.setString(1, filename);
byte[] filedata = exchange.getIn().getBody(byte[].class);
stmt.setBytes(2,filedata );
int s = stmt.executeUpdate();

}
catch (Exception e)
{
System.out.println(e.getMessage());
}
finally{
try
{
if (stmt!=null)
{
stmt.close();
}
if (conn!=null)
{
conn.close();
}
}
catch(SQLException e)
{
System.out.println(e.getMessage());
}
}


}

/**
* @param dataSource the dataSource to set
*/
public void setDataSource(DriverManagerDataSource dataSource) {
this.dataSource = dataSource;
}
}

来自 Camel 的人做得很好。 Camel 非常灵活,尤其是当您将它与 Spring 结合使用时。

多么美妙的旅程啊!

关于mysql - 二进制文件到 SQL 数据库 Apache Camel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9821310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com