Suche senden
Hochladen
WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形
•
0 gefällt mir
•
1,607 views
Yusaku Watanabe
Folgen
Melden
Teilen
Melden
Teilen
1 von 11
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
JAWS-UG CLI #27 LT ActiveDirectoryのユーザとパスワードでManagement Consoleにログインする
JAWS-UG CLI #27 LT ActiveDirectoryのユーザとパスワードでManagement Consoleにログインする
Nobuhiro Nakayama
MySQLデータ暗号化と暗号鍵のローテーション
MySQLデータ暗号化と暗号鍵のローテーション
Shinya Sugiyama
20120201 aws meister-reloaded-iam-and-billing-public
20120201 aws meister-reloaded-iam-and-billing-public
Amazon Web Services Japan
[AWSマイスターシリーズ]Identity and Access Management (IAM)
[AWSマイスターシリーズ]Identity and Access Management (IAM)
Amazon Web Services Japan
脆弱性は誰のせい? PHP、MySQL、Joomla! の責任やいかに
脆弱性は誰のせい? PHP、MySQL、Joomla! の責任やいかに
Hiroshi Tokumaru
Jazug_202102_csc_ichikawa
Jazug_202102_csc_ichikawa
Yuto Ichikawa
AWS CLIでAssumeRole
AWS CLIでAssumeRole
Tetsunori Nishizawa
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Shinya Yamaguchi
Empfohlen
JAWS-UG CLI #27 LT ActiveDirectoryのユーザとパスワードでManagement Consoleにログインする
JAWS-UG CLI #27 LT ActiveDirectoryのユーザとパスワードでManagement Consoleにログインする
Nobuhiro Nakayama
MySQLデータ暗号化と暗号鍵のローテーション
MySQLデータ暗号化と暗号鍵のローテーション
Shinya Sugiyama
20120201 aws meister-reloaded-iam-and-billing-public
20120201 aws meister-reloaded-iam-and-billing-public
Amazon Web Services Japan
[AWSマイスターシリーズ]Identity and Access Management (IAM)
[AWSマイスターシリーズ]Identity and Access Management (IAM)
Amazon Web Services Japan
脆弱性は誰のせい? PHP、MySQL、Joomla! の責任やいかに
脆弱性は誰のせい? PHP、MySQL、Joomla! の責任やいかに
Hiroshi Tokumaru
Jazug_202102_csc_ichikawa
Jazug_202102_csc_ichikawa
Yuto Ichikawa
AWS CLIでAssumeRole
AWS CLIでAssumeRole
Tetsunori Nishizawa
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Shinya Yamaguchi
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
junichi anno
リソーステンプレート入門
リソーステンプレート入門
junichi anno
安全なWebアプリケーションの作り方2018
安全なWebアプリケーションの作り方2018
Hiroshi Tokumaru
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
junichi anno
Azure ADとIdentity管理
Azure ADとIdentity管理
Naohiro Fujie
OAuth2.0によるWeb APIの保護
OAuth2.0によるWeb APIの保護
Naohiro Fujie
OCHaCafe#5 - 避けては通れない!認証・認可
OCHaCafe#5 - 避けては通れない!認証・認可
オラクルエンジニア通信
MicrosoftのDID/VC実装概要
MicrosoftのDID/VC実装概要
Naohiro Fujie
文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)
Hiroshi Tokumaru
はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)
はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)
オラクルエンジニア通信
エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識
Daiyu Hatakeyama
セキュアコーディング方法論再構築の試み
セキュアコーディング方法論再構築の試み
Hiroshi Tokumaru
Azure AD x LINE x Auth0
Azure AD x LINE x Auth0
Naohiro Fujie
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門
Hiroshi Tokumaru
Share point における id管理と認証・認可
Share point における id管理と認証・認可
Naohiro Fujie
Azure active directory によるデバイス管理の種類とトラブルシュート事例について
Azure active directory によるデバイス管理の種類とトラブルシュート事例について
Shinya Yamaguchi
ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門
Hiroshi Tokumaru
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Yuki Hattori
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
Hiroshi Tokumaru
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
takezoe
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
Yuji Takayama
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
Ayumi Goto
Weitere ähnliche Inhalte
Was ist angesagt?
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
junichi anno
リソーステンプレート入門
リソーステンプレート入門
junichi anno
安全なWebアプリケーションの作り方2018
安全なWebアプリケーションの作り方2018
Hiroshi Tokumaru
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
junichi anno
Azure ADとIdentity管理
Azure ADとIdentity管理
Naohiro Fujie
OAuth2.0によるWeb APIの保護
OAuth2.0によるWeb APIの保護
Naohiro Fujie
OCHaCafe#5 - 避けては通れない!認証・認可
OCHaCafe#5 - 避けては通れない!認証・認可
オラクルエンジニア通信
MicrosoftのDID/VC実装概要
MicrosoftのDID/VC実装概要
Naohiro Fujie
文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)
Hiroshi Tokumaru
はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)
はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)
オラクルエンジニア通信
エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識
Daiyu Hatakeyama
セキュアコーディング方法論再構築の試み
セキュアコーディング方法論再構築の試み
Hiroshi Tokumaru
Azure AD x LINE x Auth0
Azure AD x LINE x Auth0
Naohiro Fujie
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門
Hiroshi Tokumaru
Share point における id管理と認証・認可
Share point における id管理と認証・認可
Naohiro Fujie
Azure active directory によるデバイス管理の種類とトラブルシュート事例について
Azure active directory によるデバイス管理の種類とトラブルシュート事例について
Shinya Yamaguchi
ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門
Hiroshi Tokumaru
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Yuki Hattori
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
Hiroshi Tokumaru
Was ist angesagt?
(19)
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
V1.1 CD03 Azure Active Directory B2C/B2B コラボレーションによる Customer Identity and Ac...
リソーステンプレート入門
リソーステンプレート入門
安全なWebアプリケーションの作り方2018
安全なWebアプリケーションの作り方2018
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
1/5 ADFS 2.0 を使用してWindows Azure との SSO を実現しよう v1.1
Azure ADとIdentity管理
Azure ADとIdentity管理
OAuth2.0によるWeb APIの保護
OAuth2.0によるWeb APIの保護
OCHaCafe#5 - 避けては通れない!認証・認可
OCHaCafe#5 - 避けては通れない!認証・認可
MicrosoftのDID/VC実装概要
MicrosoftのDID/VC実装概要
文字コードに起因する脆弱性とその対策(増補版)
文字コードに起因する脆弱性とその対策(増補版)
はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)
はじめてのOracle Cloud Infrastructure(Oracle Cloudウェビナーシリーズ: 2020年9月2日)
エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識
セキュアコーディング方法論再構築の試み
セキュアコーディング方法論再構築の試み
Azure AD x LINE x Auth0
Azure AD x LINE x Auth0
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門
Share point における id管理と認証・認可
Share point における id管理と認証・認可
Azure active directory によるデバイス管理の種類とトラブルシュート事例について
Azure active directory によるデバイス管理の種類とトラブルシュート事例について
ウェブアプリケーションセキュリティ超入門
ウェブアプリケーションセキュリティ超入門
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
著名PHPアプリの脆弱性に学ぶセキュアコーディングの原則
Ähnlich wie WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
takezoe
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
Yuji Takayama
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
Ayumi Goto
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
Yuji Takayama
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
Hiroshi Tokumaru
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing
HTML5でオフラインWebアプリケーションを作ろう
HTML5でオフラインWebアプリケーションを作ろう
yoshikawa_t
Java EE8 Report
Java EE8 Report
Norito Agetsuma
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
Kazuki Nakajima
MailFluteでメール送信を楽しもう!
MailFluteでメール送信を楽しもう!
p1us2er0
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
Insight Technology, Inc.
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
日本マイクロソフト株式会社
Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...
Shotaro Suzuki
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
Yuji Takayama
文字コードの脆弱性はこの3年間でどの程度対策されたか?
文字コードの脆弱性はこの3年間でどの程度対策されたか?
Hiroshi Tokumaru
msal.js v2を触る
msal.js v2を触る
DevTakas
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコード
K Kimura
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
Fumihiko Shiroyama
今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識
Minoru Naito
Treasure data demo.0517
Treasure data demo.0517
BigData Sios
Ähnlich wie WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形
(20)
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
HTML5でオフラインWebアプリケーションを作ろう
HTML5でオフラインWebアプリケーションを作ろう
Java EE8 Report
Java EE8 Report
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
MailFluteでメール送信を楽しもう!
MailFluteでメール送信を楽しもう!
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
文字コードの脆弱性はこの3年間でどの程度対策されたか?
文字コードの脆弱性はこの3年間でどの程度対策されたか?
msal.js v2を触る
msal.js v2を触る
Ibm worklight デモ環境とサンプルコード
Ibm worklight デモ環境とサンプルコード
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識
Treasure data demo.0517
Treasure data demo.0517
Mehr von Yusaku Watanabe
組織をシステム化するReactiveManagement
組織をシステム化するReactiveManagement
Yusaku Watanabe
エンジニアがプロダクトマネージャーに進化すると何が起きるのか
エンジニアがプロダクトマネージャーに進化すると何が起きるのか
Yusaku Watanabe
QCon SF-feedback
QCon SF-feedback
Yusaku Watanabe
Regional Scrum Gathering® Tokyo 2014
Regional Scrum Gathering® Tokyo 2014
Yusaku Watanabe
Jvm operation casual talks
Jvm operation casual talks
Yusaku Watanabe
PageRankアルゴリズムを使った人事評価についての実験
PageRankアルゴリズムを使った人事評価についての実験
Yusaku Watanabe
スケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考える
Yusaku Watanabe
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング -GPGPUも-
Yusaku Watanabe
実録 WEBエンジニアが Titanium Mobileアプリを開発するまで
実録 WEBエンジニアが Titanium Mobileアプリを開発するまで
Yusaku Watanabe
Ameba Piggの裏側
Ameba Piggの裏側
Yusaku Watanabe
GPGPUによるパーソナルスーパーコンピュータの可能性
GPGPUによるパーソナルスーパーコンピュータの可能性
Yusaku Watanabe
Mehr von Yusaku Watanabe
(11)
組織をシステム化するReactiveManagement
組織をシステム化するReactiveManagement
エンジニアがプロダクトマネージャーに進化すると何が起きるのか
エンジニアがプロダクトマネージャーに進化すると何が起きるのか
QCon SF-feedback
QCon SF-feedback
Regional Scrum Gathering® Tokyo 2014
Regional Scrum Gathering® Tokyo 2014
Jvm operation casual talks
Jvm operation casual talks
PageRankアルゴリズムを使った人事評価についての実験
PageRankアルゴリズムを使った人事評価についての実験
スケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考える
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング -GPGPUも-
実録 WEBエンジニアが Titanium Mobileアプリを開発するまで
実録 WEBエンジニアが Titanium Mobileアプリを開発するまで
Ameba Piggの裏側
Ameba Piggの裏側
GPGPUによるパーソナルスーパーコンピュータの可能性
GPGPUによるパーソナルスーパーコンピュータの可能性
WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形
1.
2012-08/メディアクリエイティブDiv/WEB開発を加 速させる。アジャイル開発に最適なデータ構造とORマ ッパの形(渡辺雄作) 概要 本稿では、JavaオブジェクトをJsonにシリアライズし永続化するフレームワークを実装しました。 本フレームワークでは、任意のJavaフィールドに@IndexedをつけることによりいわゆるPrimaryKeyだけではないフィールドでの検索を可 能にしています。 現在開発中のプロジェクトでは本フレームワークを利用して開発を進めており、グループの基盤データベース構築プロジェクトでの採用を 進めています。 WEBで提供するほとんどのサービスは本フレームワークを利用することにより非常に高い効率で開発できると考えています。 現在はデータストアとしてMySQL, MongoDB, HBaseに対応しています。 序論 BtoCで提供される多くのWEBサービスで求められているのは サービスの開発速度 スケーラビリティ 高パフォーマンス だと思います。 その中でアメーバピグで利用されているIndexPersister FrameworkはKeyValueの形でデータをバイナリでストアするAPIを提供しており、ストアするデータベースの形は問わないアプローチを 採用しています。 実際アメーバピグでは現在の規模でもその形でサービスを提供し続けており、シンプルな(必要最低限な)データ永続化APIがあればサー ビスを開発できることがわかります。 IndexPersisterは完全にkeyValueとしてデータアクセスしていますが、今回開発したJsonPersisterでは任意のJavaフィールドに@Indexed をつけることによりいわゆるPrimaryKeyだけではないフィールドでの検索を可能にしています。 この形はFriendFeedで採用されていたり、最近ではサイボウズが提供しているクラウド型データベースKintoneでも同じアプローチをとっ ているようです。 ※サイボウズKintoneに関してはDevelopers
Summitで発表がありましたが、発表資料が都合により削除されてしまっているようです。 現在開発中のプロジェクトではこのフレームワークを利用して開発を進めており、グループの基盤データベース構築プロジェクトでの採用 を進めています。 ※現在のグループではJsonPersisterHBaseの採用を進めています。 WEBで提供するほとんどのサービスはこのフレームワークを利用することにより非常に高い効率で開発できると考えています。 目次 概要 序論 目次 内容 JsonPersisterの特徴 モジュール構成 json_persister_core json_persister_mysql json_persister_mongo json_persister_hbase シリアライズの流れ
2.
主要なインターフェース JsonPersister.save JsonPersister.delete JsonPersister.load JsonPersister.list JsonPersister.createTable JsonPersister.dropTable 高度な使い方 複合インデックス 暗号化 キャッシュ 各モジュールについて json_persister_mysql データ保存形式 QuickStart DIコンテナを利用しない場合 springでの利用 json_persister_mongo json_persister_hbase FAQ このフレームワークを使うメリット・デメリットは? トランザクション使えないんですか? MySQL実装を使うメリットはなんですか? まとめ 参考文献 内容 JsonPersisterの特徴 javaオブジェクトをjsonデータとして永続化するフレームワークです。 javaオブジェクトを直接save、loadするシンプルなAPIを提供し、データストア依存のプログラミングを減らすことにより超高速 にDB連携アプリケーションが開発できます。 特定のフレームワーク(springやseasarなど)に依存せずに利用できます。 データストアに依存せずに共通のインターフェースを通じてjavaオブジェクトをシリアライズすることを目指しています。 現在はMysql, MongoDB, HBaseに対応しています モジュール構成 json_persister_core コアロジックを定義しています json_persister_mysql mysql実装です json_persister_mongo mongo実装です json_persister_hbase hbase実装です シリアライズの流れ 下記POJOを例に挙げる --------------------------------------------------------------------------------------
3.
UserData.java @DataBaseId(id = 1) @Persistable(name
= "user_data") public class UserData { @PrimaryKey private String userName; @PrimaryKey private String age; @Indexed private Date date; private String address; private Family family; @CompositeIndexed(name={"userName", "age", "address"}) public void composite_index0() {} public static class Family { private List<String> familyNames; public List<String> getFamilyNames() { return familyNames; } public void setFamilyNames(List<String> familyNames) { this.familyNames = familyNames; } } public Family getFamily() { return family; } public void setFamily(Family family) { this.family = family; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; }
4.
public Date getDate()
{ return date; } public void setDate(Date date) { this.date = date;
5.
} } 上記のPOJOをjson_persister.save()すると以下のJavaオブジェクトが下記のようなjsonに変換される { "address": "setagaya", "age": "33", "date":
1341914556082, "family": { "familyNames": [ "masami", "akari", "sakutarou" ] }, "userName": "yuhsaku" } 主要なインターフェース JsonPersister.save javaオブジェクトを保存します Sample.java UserData userDataQuery = new UserData(); userDataQuery.setUserName("yuhsaku"); //@PrimaryKey(必須) userDataQuery.setAge(32); //@PrimaryKey(必須) userDataQuery.setDate(new Date()); //@Indexedは(必須) userDataQuery.setAddress("setagaya"); jsonPersister.save(userDataQuery); JsonPersister.delete @PrimaryKey指定で一意なjavaオブジェクトを物理削除します Sample.java UserData userDataQuery = new UserData(); userDataQuery.setUserName("yuhsaku"); //@PrimaryKey(必須) userDataQuery.setAge(32); //@PrimaryKey(必須) jsonPersister.delete(userDataQuery); JsonPersister.load @PrimaryKey指定で一意なjavaオブジェクトを取得します
6.
Sample.java UserData userDataQuery =
new UserData(); userDataQuery.setUserName("yuhsaku"); userDataQuery.setAge(32); //第三引数は取得するデータの最新性を担保するかどうかです。(falseを指定するとmysqlの場合はslaveからデ ータを取得します。masterから取得したい場合はtrueを渡してください) UserData result_yuhsaku = jsonPersister.load(userDataQuery, UserData.class, false); JsonPersister.list javaオブジェクトを指定した条件でリスト取得します Sample.java //32才のUserDataオブジェクトをリスト取得します(5番目から10件をuserNameで降順で取得) UserData userDataQuery = new UserData(); userDataQuery.setAge(32); Criteria<UserData> criteria = Criteria.createCriteria(UserData.class).andEquals(userDataQuery).offset(5).limit(10).orderBy("userName", Criteria.ORDER.DESC); //第三引数は取得するデータの最新性を担保するかどうかです。(falseを指定するとmysqlの場合はslaveからデ ータを取得します。masterから取得したい場合はtrueを渡してください) //Criteriaでlimitの指定がない場合は100件がデフォルトです(nullを明示的に指定すればlimitは指定されませ ん = 全件取得になります) List<UserData> resultList = jsonPersister.list(criteria, true); Criteriaには他にもLesserThanやGreaterThanなどの比較条件のメソッドも用意されています。 JsonPersister.createTable テーブルを作成します Sample.java jsonPersister.createTable(UserData.class); JsonPersister.dropTable テーブルをdropします Sample.java jsonPersister.dropTable(UserData.class); 高度な使い方
7.
複合インデックス 以下のようなダミーメソッドを作成して@CompositeIndexedを指定するとcreateTable時に複合インデックスが作成されます @CompositeIndexed(name={"userName", "age", "address"}) public
void composite_index0() {} nameに指定したプロパティ名の順番で複合インデックスが作成されます 暗号化 以下のようにフィールドに@Encryptoアノテーションをつけることによりそのフィールドが暗号化されて永続化されます。(String型のみ 対応しています) @Encrypto(algorithm="AES", keyLength=256) private String address; 暗号化を有効化するためにはそのクラスはAbstractEncryptoableを継承する必要があります。 以下サンプル SecureInfo.java @DataBaseId(id=0) @Persistable(name="user_secure_info") public class SecureInfo extends AbstractEncryptoable{ @PrimaryKey private String userId; @Encrypto(algorithm="AES", keyLength=256) private String mailAddress; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getMailAddress() { return mailAddress; } public void setMailAddress(String mailAddress) { this.mailAddress = mailAddress; } } 保存、取得する際は暗号化キーをsetする必要があります
8.
//保存 SecureInfo secureInfo =
new SecureInfo(); secureInfo.setUserId("hogehoge"); secureInfo.setMailAddress("hogehoge@co.jp"); secureInfo.setCryptoSeed("hogehoge_key"); //暗号化、復号化する際のキー文字列 jsonPersister.save(secureInfo); //取得 SecureInfo secureInfoQuery = new SecureInfo(); secureInfoQuery.setUserId("hogehoge"); secureInfoQuery.setCryptoSeed("hogehoge_key"); //暗号化、復号化する際のキー文字列 SecureInfo result = jsonPersister.load(secureInfoQuery, SecureInfo.class, false); @EncryptoアノテーションにはDESやAESなどjavaでサポートされているアルゴリズムを文字列で指定できます。 ※AES-256はJavaランタイムに無制限強度の管轄ポリシーの設定追加が必要です。 javaのインストールディレクトリ配下のjre/lib/securiy/以下に http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html からダウンロードしたzipに入っているlocal_policy.jarとUS_export_policy.jarを上書きコピーしてください キャッシュ classに@Cacheableを指定するヒープに指定した時間キャッシュすることができます @Cacheable(expire=5000) @DataBaseId(id = 1) @Persistable(name = "user_data") public class UserData { 以下略 各モジュールについて json_persister_mysql データ保存形式 jsonに変換された後以下のテーブルに保存される(テーブルは事前にjson_persister.CreateTableExecuteインターフェースを通じて作成し ておく必要がある) -------------------------------------------------------------------------------------CREATE TABLE `user_data` ( `userName_index` text NOT NULL, `age_index` text NOT NULL, `date_index` datetime DEFAULT NULL, `address_index` text, `data` text NOT NULL, PRIMARY KEY (`userName_index`(255),`age_index`(255)), KEY `date_idx` (`date_index`), KEY `composite_index0_idx` (`userName_index`(255),`age_index`(255),`address_index`(255)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | -------------------------------------------------------------------------------------- QuickStart
9.
DIコンテナを利用しない場合 ドキュメント整備中 springでの利用 springの設定方法は以下の通り <bean id="perser" class="jp.co.cyberagent.persister.parser.JaksonPerser"
/> <context:component-scan base-package="jp.co.cyberagent.persister" /> <bean id="masterConnectionHolder" class="jp.co.cyberagent.persister.mysql.SingleConnectionHolder" > <property name="dataSource" ref="masterDataSourceHolder" /> </bean> <bean id="slaveConnectionHolder" class="jp.co.cyberagent.persister.mysql.SingleConnectionHolder" > <property name="dataSource" ref="slaveDataSourceHolder" /> </bean> <bean id="masterDataSourceHolder" class="jp.co.cyberagent.persister.mysql.SingleConnectionHolder" > <property name="dataSource"> <bean class="org.apache.commons.dbcp.datasources.SharedPoolDataSource"> <property name="connectionPoolDataSource"> <bean class="org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/ameba"/> <property name="user" value="root"/> <property name="password" value=""/> </bean> </property> <property name="defaultAutoCommit" value="true"/> <property name="maxActive" value="3"/> <property name="maxIdle" value="1"/> <property name="maxWait" value="500"/> </bean> </property> </bean> <bean id="slaveDataSourceHolder" class="jp.co.cyberagent.persister.mysql.SingleConnectionHolder" > <property name="dataSource"> <bean class="org.apache.commons.dbcp.datasources.SharedPoolDataSource"> <property name="connectionPoolDataSource"> <bean class="org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3316/ameba"/> <property name="user" value="root"/> <property name="password" value=""/> </bean> </property> <property name="defaultAutoCommit" value="true"/> <property name="maxActive" value="3"/> <property name="maxIdle" value="1"/> <property name="maxWait" value="500"/> </bean> </property> </bean> json_persister_mongo ドキュメント整備中
10.
json_persister_hbase ドキュメント整備中 FAQ このフレームワークを使うメリット・デメリットは? メリット ・シンプルなAPIで学習コストが低い RDMSを操作するようなO/Rマッパーなどは豊富な機能を提供しているが故に慣れるまでそれなりに時間がかかります。 JsonPersisterはアメーバピグでの開発を踏まえ、必要最低限の機能を提供しているためシンプルなAPIでテンポ良く開発 ができます。 JavaObjectをsaveしたりloadしたり、listで複数取得するだけです。 データストアとのやり取りなんてそれぐらいできれば事が済んでしまうことがほとんどだからです。(実際アメーバピグ もこれらのAPIだけでmysqlとやりとりしています) ・データストア依存のコードを隠蔽することにより開発速度が(非常に)高くなる iBatisなどのO/Rマッパーを利用している人がほとんどだと思いますが、ユーザーサービスのアプリケーションにおいては 、複雑なSQLをonlineで発行することはほとんどないと思います。 データストアを意識したコード(SQLやデータバインドなど)を無くし、余計な手間を減らせるため非常に高い開発効率 を実現できます。 ・データストアに依存しない共通のInterFaceでデータを扱う データモデルによってはRDMSに向いているデータとNoSQLに向いているデータがあると思いますが、システム拡張によ るデータストア切り替えや、データモデルによってはストア先を変更するなどの処理をアプリケーションレイヤからは意 識せずデータをストアすることができます つまり、DIコンテナを使っていればデータストアを変更した場合(例えばmysql→mongodbとか)でもアプリケーション 側のコードの変更は一切必要ありません。(DIを使っていない場合はFactory依存のクラスを変更するだけで済みます) デメリット ユーザーサービスでの利用に特化しているためトランザクションやjoinなどのいわゆるRDMS的な豊富な機能はありません 。 それらの機能とトレードオフとしてシンプルなAPIを提供しています。 トランザクション使えないんですか? トランザクションはDBのスケーラビリティを損なうのであえて外してあります。 RDMSで提供しているトランザクションを使うと垂直、水平分散を行う際に妨げになるため切り離して考えています。(スキーマをまたが ったトランザクションを取得できないとかあるので) 代わりにグローバルロック機構をhazelcastを使って実現するというのはいかがでしょうか? http://www.hazelcast.com/index.jsp hazelcastではネットワークを介したクラスタ上でのグローバルロックを実現することも可能です。 http://www.hazelcast.com/docs/2.0/manual/single_html/#Lock
11.
Sample.java Lock lock =
Hazelcast.getLock(myLockedObject); lock.lock(); try { // データ1をsave // データ2をsave } finally { lock.unlock(); } みたいな。 残念ながらhazelcastを使ってもロールバックはできませんが、mysqlのバックアップやバイナリログからの復旧ができるので障害時などは 運用でカバーできる範囲かと思っています。 トレードオフですが、個人的にはここらへんの機能を削ってでも得られる開発スピードのメリットを推しています。 MySQL実装を使うメリットはなんですか? MySQLはamebaでも非常に実績のあるRDBMSです。 それをデータストアに使うことによって、安定性や運用ノウハウをそのまま利用することができます。 O/Rマッパー経由でMySQLを使うことはできますが、テーブル正規化や仕様変更によるテーブル構成変更はamebaの多くのWEBサービス において運用ボトルネックになりやすいので スキーマレスにデータを保存できるという点でjsonPersisterは優れています。 まとめ 現在進めているプロジェクトでの開発で実際に利用していますが、MyBatisなどを利用する場合に比べて非常に柔軟な開発が可能です。 PrimaryKeyだけは最初に決めておく必要がありますが、それ以外のデータは開発途中での要件変更やデータ構造の変更が容易だからです 。 Scrumなどアジャイルに開発しているプロジェクトではなおさら高い効率を出せるかと思います。 MyBatisなどのORマッパを使うぐらいならこれを利用するほうが断然がシンプルだと感じました。 参考文献 FriendFeed では MySQL を使いどのようにスキーマレスのデータを保存しているのかhttp://www.hyuki.com/yukiwiki/wiki.cgi?HowFri endFeedUsesMySqlToStoreSchemaLessData
Jetzt herunterladen