精华内容
下载资源
问答
  • 1. SparkSql 并发读取数据库 SparkSql连接数据库读取数据给了三个API: //Construct a DataFrame representing the database table accessible via JDBC URL url named table and connection properties. Dataset&...

    1. SparkSql 高并发读取数据库

    SparkSql连接数据库读取数据给了三个API:

    //Construct a DataFrame representing the database table accessible via JDBC URL url named table and connection properties.
    Dataset<Row> 	jdbc(String url, String table, java.util.Properties properties)
    //Construct a DataFrame representing the database table accessible via JDBC URL url named table using connection properties.
    Dataset<Row> 	jdbc(String url, String table, String[] predicates, java.util.Properties connectionProperties)
    //Construct a DataFrame representing the database table accessible via JDBC URL url named table.
    Dataset<Row> 	jdbc(String url, String table, String columnName, long lowerBound, long upperBound, int numPartitions, java.util.Properties connectionProperties)
    

    三个API介绍:

    1. 单个分区,单个task执行,无并发

      遇到数据量很大的表,抽取速度慢。

      实例:

      SparkSession sparkSession = SparkSession.builder().appName("SPARK_FENGDING_TASK1").master("local").config("spark.testing.memory", 471859200).getOrCreate();
      // 配置连接属性
      Properties dbProps = new Properties();
      dbProps.put("user","user");
      dbProps.put("password","pwd");
      dbProps.put("driver","oracle.jdbc.driver.OracleDriver");
      // 连接数据库 获取数据 要使用自己的数据库连接串
      Dataset<Row> tableDf = sparkSession.read().jdbc("jdbc:oracle:thin:@IP:1521:DEMO", "TABLE_DEMO", dbProps);
      // 返回1
      tableDf.rdd().getPartitions();
      

      该API的并发数为1,单分区,不管你留给该任务节点多少资源,都只有一个task执行任务

    2. 任意字段分区

      该API是第二个API,根据设置的分层条件设置并发度:

      def jdbc(
          url: String,
          table: String,
          predicates: Array[String], #这个是分层的条件,一个数组
          connectionProperties: Properties): DataFrame = {
          val parts: Array[Partition] = predicates.zipWithIndex.map { case (part, i) =>
              JDBCPartition(part, i) : Partition
          }
          jdbc(url, table, parts, connectionProperties)
      }
      

      实例:

      // 设置分区条件 通过入库时间 把 10月和11月 的数据 分两个分区
      String[] patitions = {"rksj >= '1569859200' and rksj < '1572537600'","rksj >= '1572537600' and rksj < '1575129600'"};
      // 根据StudentId 分15个分区,就会有15个task抽取数据
      Dataset<Row> tableDf3 = sparkSession.read().jdbc("jdbc:oracle:thin:@IP:1521:DEMO", "TABLE_DEMO",patitions,dbProps);
      // 返回2
      tableDf3.rdd().getPartitions();
      

      该API操作相对自由,就是设置分区条件麻烦一点。

    3. 根据Long类型字段分区
      该API是第三个API,根据设置的分区数并发抽取数据:

      def jdbc(
          url: String,
          table: String,
          columnName: String,    # 根据该字段分区,需要为整形,比如id等
          lowerBound: Long,      # 分区的下界
          upperBound: Long,      # 分区的上界
          numPartitions: Int,    # 分区的个数
          connectionProperties: Properties): DataFrame = {
          val partitioning = JDBCPartitioningInfo(columnName, lowerBound, upperBound, numPartitions)
          val parts = JDBCRelation.columnPartition(partitioning)
          jdbc(url, table, parts, connectionProperties)
      }
      

      实例:

      // 根据StudentId 分15个分区,就会有15个task抽取数据
      Dataset<Row> tableDf2 = sparkSession.read().jdbc("jdbc:oracle:thin:@IP:1521:DEMO", "TABLE_DEMO", "studentId",0,1500,15,dbProps);
      // 返回10
      tableDf2.rdd().getPartitions();
      

      该操作根据分区数设置并发度,缺点是只能用于Long类型字段。

    2. 存储数据到数据库

    存储数据库API给了Class DataFrameWriter<T>类,该类有存储到文本,Hive,数据库的API。这里只说数据库的API,提一句,如果保存到Text格式,只支持保存一列。。。就很难受。

    实例:

    有三种写法

    // 第一张写法,指定format类型,使用save方法存储数据库
    jdbcDF.write()
      .format("jdbc")
      .option("url", "jdbc:postgresql:dbserver")
      .option("dbtable", "schema.tablename")
      .option("user", "username")
      .option("password", "password")
      .save();
    // 第二种写法 使用jdbc写入数据库
    jdbcDF2.write()
      .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties);
    
    // 第三种写法,也是使用jdbc,只不过添加createTableColumnTypes,创建表的时候使用该属性字段创建表字段
    jdbcDF.write()
      .option("createTableColumnTypes", "name CHAR(64), comments VARCHAR(1024)")
      .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties);
    

    当我们的表已经存在的时候,使用上面的语句就会报错表已存在,这是因为我们没有指定存储模式,默认是ErrorIfExists

    保存模式:

    SaveMode 实例 含义
    Append SaveMode.Append 当保存DF到数据库,如果表已经存在,我们则会在表中追加数据
    Overwrite SaveMode.Overwrite 当保存DF到数据库,如果表已经存在,我们则会重写表的数据,和truncate搭配使用
    ErrorIfExists SaveMode.ErrorIfExists 当保存DF到数据库,如果表已经存在,报错,提示表已经存在
    Ignore SaveMode.Ignore 当保存DF到数据库,如果表已经存在,不做任何操作

    所以一般都是这样用:

    tableDf3.write().mode(SaveMode.Append).jdbc("jdbc:oracle:thin:@IP:1521:DEMO", "TABLE_DEMO", connectionProperties);

    对于connectionProperties还有很多其他选项:

    Property Name Meaning
    url The JDBC URL to connect to. The source-specific connection properties may be specified in the URL. e.g., jdbc:postgresql://localhost/test?user=fred&password=secret
    dbtable The JDBC table that should be read from or written into. Note that when using it in the read path anything that is valid in a FROM clause of a SQL query can be used. For example, instead of a full table you could also use a subquery in parentheses. It is not allowed to specify dbtable and query options at the same time.
    query A query that will be used to read data into Spark. The specified query will be parenthesized and used as a subquery in the FROM clause. Spark will also assign an alias to the subquery clause. As an example, spark will issue a query of the following form to the JDBC Source. SELECT FROM () spark_gen_alias Below are couple of restrictions while using this option. It is not allowed to specify dbtable and query options at the same time. It is not allowed to specify query and partitionColumn options at the same time. When specifying partitionColumn option is required, the subquery can be specified using dbtable option instead and partition columns can be qualified using the subquery alias provided as part of dbtable. Example: spark.read.format("jdbc") .option("url", jdbcUrl) .option("query", "select c1, c2 from t1") .load()
    driver The class name of the JDBC driver to use to connect to this URL.
    partitionColumn, lowerBound, upperBound These options must all be specified if any of them is specified. In addition, numPartitions must be specified. They describe how to partition the table when reading in parallel from multiple workers. partitionColumn must be a numeric, date, or timestamp column from the table in question. Notice that lowerBound and upperBound are just used to decide the partition stride, not for filtering the rows in table. So all rows in the table will be partitioned and returned. This option applies only to reading.
    numPartitions The maximum number of partitions that can be used for parallelism in table reading and writing. This also determines the maximum number of concurrent JDBC connections. If the number of partitions to write exceeds this limit, we decrease it to this limit by calling coalesce(numPartitions) before writing.
    queryTimeout The number of seconds the driver will wait for a Statement object to execute to the given number of seconds. Zero means there is no limit. In the write path, this option depends on how JDBC drivers implement the API setQueryTimeout, e.g., the h2 JDBC driver checks the timeout of each query instead of an entire JDBC batch. It defaults to 0.
    fetchsize The JDBC fetch size, which determines how many rows to fetch per round trip. This can help performance on JDBC drivers which default to low fetch size (eg. Oracle with 10 rows). This option applies only to reading.
    batchsize The JDBC batch size, which determines how many rows to insert per round trip. This can help performance on JDBC drivers. This option applies only to writing. It defaults to 1000.
    isolationLevel The transaction isolation level, which applies to current connection. It can be one of NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, or SERIALIZABLE, corresponding to standard transaction isolation levels defined by JDBC’s Connection object, with default of READ_UNCOMMITTED. This option applies only to writing. Please refer the documentation in java.sql.Connection.
    sessionInitStatement After each database session is opened to the remote DB and before starting to read data, this option executes a custom SQL statement (or a PL/SQL block). Use this to implement session initialization code. Example: option("sessionInitStatement", """BEGIN execute immediate 'alter session set "_serial_direct_read"=true'; END;""")
    truncate This is a JDBC writer related option. When SaveMode.Overwrite is enabled, this option causes Spark to truncate an existing table instead of dropping and recreating it. This can be more efficient, and prevents the table metadata (e.g., indices) from being removed. However, it will not work in some cases, such as when the new data has a different schema. It defaults to false. This option applies only to writing.
    cascadeTruncate This is a JDBC writer related option. If enabled and supported by the JDBC database (PostgreSQL and Oracle at the moment), this options allows execution of a TRUNCATE TABLE t CASCADE (in the case of PostgreSQL a TRUNCATE TABLE ONLY t CASCADE is executed to prevent inadvertently truncating descendant tables). This will affect other tables, and thus should be used with care. This option applies only to writing. It defaults to the default cascading truncate behaviour of the JDBC database in question, specified in the isCascadeTruncate in each JDBCDialect.
    createTableOptions This is a JDBC writer related option. If specified, this option allows setting of database-specific table and partition options when creating a table (e.g., CREATE TABLE t (name string) ENGINE=InnoDB.). This option applies only to writing.
    createTableColumnTypes The database column data types to use instead of the defaults, when creating the table. Data type information should be specified in the same format as CREATE TABLE columns syntax (e.g: "name CHAR(64), comments VARCHAR(1024)"). The specified types should be valid spark sql data types. This option applies only to writing.
    customSchema The custom schema to use for reading data from JDBC connectors. For example, "id DECIMAL(38, 0), name STRING". You can also specify partial fields, and the others use the default type mapping. For example, "id DECIMAL(38, 0)". The column names should be identical to the corresponding column names of JDBC table. Users can specify the corresponding data types of Spark SQL instead of using the defaults. This option applies only to reading.
    pushDownPredicate The option to enable or disable predicate push-down into the JDBC data source. The default value is true, in which case Spark will push down filters to the JDBC data source as much as possible. Otherwise, if set to false, no filter will be pushed down to the JDBC data source and thus all filters will be handled by Spark. Predicate push-down is usually turned off when the predicate filtering is performed faster by Spark than by the JDBC data source.

    这里面的truncate就是说当使用SaveMode.Overwrite的时候,设置truncatetrue,就会对表进行truncate语句清理表,不再是删除表在重建表的操作。

    展开全文
  • 主键 :唯一标识符 唯一,性能 数据库的语言-SQL 四大基本语句—-增删改查 关键字大写,库,表,字段需要加上“ 增 – INSERT INSERT INTO 表(字段列表) VALUES(值列表) INSERT INTO `userTable` (`ID`,`username`...
  • Flash读取数据库技术2

    2009-04-05 14:26:31
    FlashMX数据库读取高级间接连接方法
  • 这几天在做一个项目,其中涉及到了文章查看的功能,显然就会涉及到分页内容了。... 首先我从数据库读取数据时,我是仅读取我要显示的条数,我利用了limit(limit用法可以上网搜索资料),然后记录当前页curre

        这几天在做一个项目,其中涉及到了文章查看的功能,显然就会涉及到分页内容了。下面就讲下我在这里面用的到技巧和遇到的问题。

        首先需要了解实现分页要获取哪些数据。总记录数totalCount,当前页数currentPage,每页显示数pageSize。

      首先我从数据库中读取数据时,我是仅读取我要显示的条数,我利用了limit(limit用法可以上网搜索资料),然后记录当前页currentPage,当下一次访问时,我会根据当前页计算出这次应该从哪读取,于是totalCount-currentPage*pageSize,计算出当前应该从哪里开始读取,在计算总页的时候使用(totalSize + pageSize - 1) / pageSize,这样就能够很简单的实现分页了。(但是我在数据中是从后往前读取的,这样先提取后面的数据)

       分页实现了,但是问题又来了,一般都是最新的文章应该在最前面显示,但是上面的做法却是最新的在最后面,那怎么办呢?当时我想的是用limit和order by组合使用,但是总是出错,后来查资料才发现是因为溢出的问题。如果先使用order by,再limit,显然这样做法每次都得对整张表进行操作,那么如果先limit,再order  by呢,乍一看似乎可以,但是实践发现不行,溢出了。我起先想用的是视图来解决。limit提取出来放在视图中,然后order by。但是这样操作明显很麻烦,后来我用的方法是,不改变读取的结果,我在遍历集合的时候进行来操作他。所以我在操作集合的时候,利用了ResultSet中的last()和isBeforeFirst()这两个函数,从集合后往前遍历就ok了。(因为数据在数据库中存储是时间顺序的,结果集取出来肯定是按照时间排序的,我往前遍历结果正好是我要的)。

       可能说得不是很清楚,但是我最后确实实现了,也知道了怎么进行高效率的读取数据库进行分页。

    展开全文
  • 我是用FLEX+JAVA程序写的一个地图线路的展示功能,但要求有一个实时的数据传递,从后台接收到数据存入数据库中,我再通过JAVA频率读取数据库来实现时实显示地图线路的功能,问题是好像监控一段时间后就会电脑很卡...
  • )SQLite3是一个轻量级的文件数据库,拥有其他数据库无可比拟的效率,其自身的C语言API已经能够满足大多数应用。蛋似,想要将数据直接显示在类似DataGrid控件中,光靠他自带的API可能就会遇到麻烦了。因为当数据量...

    (本文为本人原创,请尊重个人劳动成果。未经本人许可,严禁转载!)

    SQLite3是一个轻量级的文件数据库,拥有其他数据库无可比拟的高效率,其自身的C语言API已经能够满足大多数应用。蛋似,想要将数据直接显示在类似DataGrid控件中,光靠他自带的API可能就会遇到麻烦了。因为当数据量过大的时候,直接将所有数据数据都读到内存中来是一种低效、不靠谱的方法。此时,支持Model/View的QT就能帮上忙,快速解决这个问题。

    QT的SQL模块

    QT SQL是QT中负责处理数据库的模块,处理数据库之前,我们先要获取数据库的连接。

    1.获取数据库连接

    我们可以从QT文档中找到相应的API介绍:

    The QSqlDatabase class represents a connection to a database.

    一个QSqlDatabase类的对象,就是对数据库的一个连接。

    我们可以通过下面的代码获取PostgreSQL数据库的连接,并打开数据库:

    1

    2

    3

    4

    5

    6QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");

    db.setHostName("acidalia");

    db.setDatabaseName("customdb");

    db.setUserName("mojito");

    db.setPassword("J0a1m8");

    bool ok = db.open();

    其中,”QPSQL”表示的就是PostgreSQL的驱动(Driver),下面就是官方文档给出的各个驱动对应的字符串:

    Driver Type

    Description

    QDB2

    IBM DB2

    QIBASE

    Borland InterBase

    QMYSQL

    MySQL Driver

    QODBC

    ODBC Driver (includes Microsoft SQL Server)

    QPSQL

    PostgreSQL Driver

    QSQLITE

    SQLite version 3 or above

    QSQLITE2

    SQLite version 2

    QTDS

    Sybase Adaptive Server

    SQLite3并不需要设置用户名密码,因此要获取SQLite3连接的话,就得使用:

    1

    2QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName("hehe.db");//hehe.db就是SQLite的文件名

    2.在QTableView中显示

    模式是QT的一大亮点,在该模式下,界面与数据分开处理,同时也增强了代码的可移植性(有关Model/VIew结构的详细信息,参见 这篇文章 ),例如,对SQLite数据库处理的算法,可以很容易的移植到SQL Server里面。QT中显示格网数据的Widget是QTableView,而对应的Model类则是QSqlQueryModel或QSqlRelationalTableModel,二者区别就是,前者是只读的Model,后者为可编辑的并且支持外码。

    下面几句代码就可以简单的将db链接的数据库显示在QTableView中:

    1

    2

    3

    4

    5QTableView* widget = new QTableView();

    QAbstractTableModel* model = new SqlRelationalTableModel(NULL,db);

    model->setTable("table1");//"table1"为数据库中某一张表的名称

    model->select();//执行SQL的select语句,将数据显示在QTableView中

    widget->setModel(model);

    一个Demo

    这个demo展示一个使用QT读取SQLIte数据库的程序。这个程序中打开SQLite3数据库文件后,库内每一个表都会单独显示在一个Tab页里面。界面如图:

    在QtCreator中,新建一个GUI项目,其他都选默认参数。在ui文件中,添加一个QTabWidget,并删除其中所有的tab页。同时菜单中新建一个QAction,用以选择打开文件,并设置click对应的槽函数。

    mainwindow.h:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25#ifndef MAINWINDOW_H

    #define MAINWINDOW_H

    #include

    namespace Ui {

    class MainWindow;

    }

    class MainWindow : public QMainWindow

    {

    Q_OBJECT

    public:

    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();

    private slots:

    void on_actionOpenSQLite3File_triggered();

    void ReadDB(const QString &fileName);

    private:

    Ui::MainWindow *ui;

    };

    #endif // MAINWINDOW_H

    mainwindow.cpp:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47#include "mainwindow.h"

    #include "ui_mainwindow.h"

    #include

    #include

    #include

    MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

    {

    ui->setupUi(this);

    }

    MainWindow::~MainWindow()

    {

    delete ui;

    }

    void MainWindow::on_actionOpenSQLite3File_triggered()

    {

    QString fileName = QFileDialog::getOpenFileName(this,tr("Open a SQLite3 File"),QString(),"DB (*.db);;All files(*.*)");

    if (fileName.isEmpty())

    return;

    ReadDB(fileName);

    }

    void MainWindow::ReadDB(const QString &fileName)

    {

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName(fileName);

    if (!db.open())

    return;

    ui->tabWidget->clear();

    QSqlQuery query("Select tbl_name From sqlite_master");

    QStringList tableList;

    while (query.next()) {

    tableList << query.value(0).toString();

    }

    foreach (QString tableName, tableList) {

    QTableView* widget = new QTableView(ui->tabWidget);

    QSqlRelationalTableModel* model = new QSqlRelationalTableModel(NULL,db);

    model->setTable(tableName);

    model->select();

    widget->setModel(model);

    ui->tabWidget->addTab(widget,tableName);

    }

    }

    常见问题

    1.

    打开文件后,TableView没有显示,并且输出窗口输出以下字符串:

    QSqlDatabase: QSQLITE driver not loaded

    QSqlDatabase: available drivers: QPSQL7 QPSQL QODBC3 QODBC

    这说明QT没有找到sqlite的插件,这个插件一般在QT_DIR/plugins/sqldrivers,windows系统下的debug与release版插件分别为:qsqlited4.dll与qsqlite4.dll。原因有两个,一是qt本身并没有带这个插件,需要从源码编译;二是QT并未找到plugins所在目录,这需要设置QT_PLUGIN_PATH环境变量为插件目录(例如C:\OSGeo4W64\apps\Qt4\plugins)。

    2.

    打开文件后,TableView没有显示,并且没有输出上述字符串

    QT的sqlite插件还依赖于sqlite3.dll(Windows系统下),可将该dll放到程序所在目录下,或者PATH路径下

    展开全文
  • 方案一:读取数据库方式 从数据库读取信息→封装→生成接口数据 应用场景: 数据时效性比较的系统 方案二:读取缓存方式 从数据库获取信息(第一次设置缓存或缓存失效时)→封装(第一次设置缓存或缓存失效...

    方案一:读取数据库方式

    从数据库读取信息→封装→生成接口数据

    应用场景:

    数据时效性比较高的系统

     

    方案二:读取缓存方式

    从数据库获取信息(第一次设置缓存或缓存失效时)→封装(第一次设置缓存或缓存失效时)→返回数据

                                                                            ↓                                              ↑

                                                                         缓存(缓存生效时)     →   →    →    →

     

    方案三:定时读取缓存方式(crontab 定时任务)

     

                      封装并返回数据

                              ↑

    数据库→crontab→缓存 

                              ↑

                         http 请求

     

    =======

    方案一:

    (安装Start BlueStacks 安卓模拟器)

    流程:

    http 请求→服务器→查询数据(使用reviewdb库)→返回数据

    db.php:

     1 <?php
     2 /*
     3  * 单例模式连接数据库
     4  */
     5 class DB{
     6     static private $_instance;    //非public的类的实例的静态成员变量
     7     static private $_connectSource;    //连接数据库返回的资源句柄
     8     private $_dbConfig = array(
     9         'host'=>'127.0.0.1',
    10         'username'=>'root',
    11         'pwd'=>'',
    12         'database'=>'reviewdb'
    13     );
    14 
    15     private function __construct(){    //非public 的构造函数
    16     }
    17 
    18     static public function getInstance(){    //访问实例的公共静态方法
    19         if(!self::$_instance instanceof self){
    20             self::$_instance = new self();
    21         }
    22         return self::$_instance;
    23     }
    24 
    25     public function connect(){
    26         if(!self::$_connectSource){
    27             //连接mysql服务
    28             self::$_connectSource = @mysql_connect($this->_dbConfig['host'],$this->_dbConfig['username'],$this->_dbConfig['pwd']);
    29             if(!self::$_connectSource){
    30                 //抛出异常
    31                 throw new Exception('mysql connect error'.mysql_error());
    32             }
    33             //选择数据库
    34             mysql_select_db($this->_dbConfig['database'],self::$_connectSource);
    35             //设置字符集
    36             mysql_query('set names "UTF8"',self::$_connectSource);
    37         }
    38         return self::$_connectSource; //返回资源
    39     }
    40 }

    list.php

     1 <?php
     2 require_once 'response.php';
     3 require_once 'db.php';
     4 
     5 $page = isset($_GET['page'])?$_GET['page']:1;
     6 $pageSize = isset($_GET['pageSize'])?$_GET['pageSize']:1;
     7 if(!is_numeric($page) || !is_numeric($pageSize)){
     8     return @Response::show(401,'数据不合法');
     9 }
    10 
    11 $offset = ($page-1)*$pageSize; //每页起始数
    12 $sql = 'select * from review where is_enabled = 1 order by creation_time desc limit '.$offset.','.$pageSize;
    13 
    14 #捕获异常
    15 try{
    16     $connect = DB::getInstance()->connect();
    17 }catch(Exception $e){
    18     return Response::show(403,'数据库连接失败');
    19 }
    20 
    21 $res = mysql_query($sql,$connect);
    22 $vals = array();
    23 while($val = mysql_fetch_assoc($res)){
    24     $vals[] = $val; //二维数组
    25 }
    26 
    27 if($vals){
    28     return Response::show(200,'首页数据获取成功',$vals);
    29 }else{
    30     return Response::show(400,'首页数据获取失败',$vals);
    31 }

    response.php

      1 <?php
      2 
      3 class Response{
      4     const JSON = 'json';
      5     //封装的综合方法,默认的数据类型为json
      6     public static function show($code,$message = '',$data = '',$type = self::JSON){
      7         
      8         if(!is_numeric($code)){
      9             return '';
     10         }
     11         //供测试数组使用
     12         $result = array(
     13             'code' => $code,
     14             'message' => $message,
     15             'data' => $data
     16         );
     17         //通过get参数判断通信数据类型
     18         $typelist = array('json','xml','array'); // array为测试使用
     19         if(isset($_GET['type'])){
     20             if(in_array(strtolower($_GET['type']),$typelist)){
     21                 $type = strtolower($_GET['type']);
     22             }else{
     23                 $type = self::JSON;
     24             }
     25         }else{
     26             $type = self::JSON;
     27         }
     28 
     29         if($type == 'json'){
     30             self::json($code,$message,$data);
     31         }else if($type == 'xml'){
     32             self::xml($code,$message,$data);
     33         }else if($type == 'array'){
     34             var_dump($result);    //仅供测试
     35         }
     36     }
     37 
     38     /**
     39     * 按json方式输出通信数据
     40     * @param integer $code 状态码
     41     * @param string $message 提示信息
     42     * @param array $data 数据
     43     * return string
     44     */
     45     //设置静态方法
     46     public static function json($code,$message = '',$data = array()){
     47         if(!is_numeric($code)){
     48             return '';
     49         }
     50         //状态码、信息、数据组成的新数组
     51         $result = array(
     52             'code' => $code,
     53             'message' => $message,
     54             'data' => $data
     55         );
     56 
     57         echo json_encode($result);
     58         exit();
     59     }
     60 
     61     /**
     62     * 按 xml 方式输出通信数据
     63     * @param integer $code 状态码
     64     * @param string $message 提示信息
     65     * @param array $data 数据
     66     * return string
     67     */
     68     public static function xml($code,$message,$data){
     69 
     70         if(!is_numeric($code)){
     71             return '';
     72         }
     73 
     74         $result = array(
     75             'code' => $code,
     76             'message' => $message,
     77             'data' => $data
     78         );
     79 
     80         //修改 http 头信息
     81         header("Content-Type:text/xml");
     82         //xml头信息
     83         $xml = "<?xml version='1.0' encoding='utf-8'?>";
     84         //根节点开始标签
     85         $xml .= "<root>";
     86 
     87         $xml .= self::xmlToEncode($result);
     88 
     89         //根节点结束标签
     90         $xml .= "</root>";
     91 
     92         echo $xml;
     93         exit();
     94     }
     95 
     96     //解析$result至xml
     97     public static function xmlToEncode($data){
     98         $xml = $attr = "";
     99         foreach($data as $k=>$v){
    100             //如果$k是数字(data(code,message,data中的data)数据里面还含有索引数组),要进行如下判断
    101             if(is_numeric($k)){
    102                 $attr = "id='{$k}'";
    103                 $k = 'item ';
    104             }
    105 
    106             $xml .= "<{$k}{$attr}>";
    107             //如果$v是数组,则递归调用该方法
    108             if(is_array($v)){
    109                 $xml .= self::xmlToEncode($v);
    110             }else{
    111                 $xml .= $v;
    112             }
    113             $xml .= "</{$k}>";
    114         }
    115 
    116         return $xml;
    117     }
    118 }

     

    转载于:https://www.cnblogs.com/lxj0205/p/9995581.html

    展开全文
  • Pycharm读取数据库MySQL中的数据

    千次阅读 2020-03-17 12:13:34
    sqlchemySQLAlchemy采用简单的Python语言,为高效和性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。 ...
  • 资源介绍:源码演示了读取Access数据到列表框方法一,读取Access数据到列表框方法二,读取Access数据到高级表格方法一,读取Access数据到高级表格方法二,打开Excel文件到高级表格。资源作者:
  • 一天的时间走过了N个坑分享一下我使用的Unity2019.2mysql8.0.19如果想用unity读取数据库内容只需要安装一个DLL文件就可以了MySql.Data.dll这里你会遇到第一个坑这个文件你可以去mysql官网去下载一个程序程序安装好在...
  • 通过CVI读取数据库SQL的数据

    千次阅读 2012-08-11 19:08:02
     利用CVI读取数据库数据的方法  1.map形式:这种方法自动生成简单的数据库语句,不能对数据库进行高级操作,不建议使用  2.显式explicit形式:这种方式需要绑定,可以使用,但是若数据库中数据类型在绑定函数...
  • SUSE 默认使用 zypper 安装软件时提示 denied 的解决办法SUSE 因为是企业级发行版,对于安全和隐私要求,所以官方是不允许直接通过 mirrors.aliyun.com 公网访问源的,而必须通过 mirrors.aliyuncs.com...
  • 为了提高站点性能,部署了一台Redis,把资源从SqlServer数据库中同步到Redis,站点由原来的读取数据库,变更为读取Redis,以利用Redis的并发提升站点性能目的。 环境说明: 1、假设表名为softs, 记录的更新时间...
  • 管理工具用的是Navicat 11,连接数据库是报错Unknown character set: 'utf8mb4',起初并没有太在意这个问题,因为第一次用Navicat时并没有出现这个问题,右键“编辑连接”在“高级”里的编码选择utf8后问题消失,这...
  • 很多网站都有一个随便看看功能,常见的实现方式是通过数据库的rand()函数来随机排序实现获取随机的数据,但是效率不,并且每次获取的数据没有关联,会出现重复的数据。 如果业务上需要随机读取表中的数据,但是...
  • 假设,有一张100W规模,并且活跃度很数据库表,需要从数据库中随机读取20条数据,并且对性能要求很的要求。 代码仅作实例!!! 方案一: 使用数据库随机取20条,代码如下: SELECT * FROM t_user u ...
  • 为了避免反复的手手工从后台数据库导出某些数据表到Excel文件、效率到多份离线数据。二、功能事项支持一次性导出多个数据源表、自动获取各表的字段名。支持控制批次的写入速率。例如:每5000行一个批次写入到excel...
  • 高级读取 1.连接查询 select * from info,nation 形成笛卡尔积 select * from info,nation where info.nation=nation.code select Info.code,Info.name,Info.sex,Nation.name as '民族',Info.birthday from ...
  • ``` @RequestMapping(value = "regionInfoDload",method = RequestMethod.GET) public void infoDownLoad(Integer regionLevel, HttpServletRequest request, HttpServletResponse response, Model model) { ...
  • asp无法读取access数据库也没有报错的情况处理方法: 选择当前站点的应用程序池,右侧点击“高级设置”,双击“启用32位应用程序”切换为“True”,点击确定返回。刷新即可 ...
  • 日前,为质量推进工信部2020年关键软件适配验证中心专项——数据库适配验证中心建设,国家工业信息安全发展研究中心组织召开“数据库适配验证中心项目”电信行业实施方案评审会,听取亚信科技行业专家对电信行业...
  •  这篇文章主要是我们在jdbc开发的时候,通过jdbc提供的接口,读取有关数据库表的数据字典的信息,虽然每种数据库都有各自的系统的数据字典表,通过对数据字典表的sql访问,就可以读到数据字典信息,但是跨数据库的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,023
精华内容 2,809
关键字:

高读取数据库